次の方法で共有


C スタイルの文字列に関連する CString の操作方法

CString オブジェクトには、文字列データが格納されます。 CString は、クラス テンプレート CStringT に定義されたメソッドと演算子のセットを継承して、文字列データを操作します。 (CString は、CStringT を特化して、CString がサポートする種類の文字データを操作できるようにした typedef です。

CString は、C スタイルの null で終わる文字列として文字データを内部的に保存しません。 代わりに、CString は、文字データの長さを追跡して、必要なデータと空白をより安全に監視できるようにします。

CString では、C スタイルの文字列を使用でき、文字データに C スタイルの文字列としてアクセスできます。 ここでは、CString オブジェクトを C スタイルの null で終わる文字列のように使用する方法について説明します。

  • C スタイルの null で終わる文字列への変換

  • 標準ランタイム ライブラリ文字列関数の使用

  • CString オブジェクトの内容の直接変更

  • 可変個の引数リストを取る関数での CString オブジェクトの使用

  • CString 仮パラメーターの正確な指定

C スタイルの Null で終わる文字列としての CString の使用

CString オブジェクトを C スタイルの文字列として使用するには、オブジェクトを LPCTSTR にキャストします。 次の例では、CString は、読み取り専用の C スタイルの null で終わる文字列へのポインターを返します。 strcpy 関数が C スタイルの文字列のコピーを myString 変数に格納します。

    CString aCString = "A string";
    char myString[256];
    strcpy(myString, (LPCTSTR)aString);

SetAt などの CString メソッドを使用して、文字列オブジェクトの中の文字を個別に変更できます。 ただし、LPCTSTR ポインターは一時的であり、CString が変更されたときに無効になります。 CString をスコープの外に出して自動的に削除することもできます。 CString オブジェクトを使用するときは、常に最新の LPCTSTR ポインターを取得することをお勧めします。

CString データを直接変更するには、そのコピーが必要な場合があります。 CString オブジェクトを別のバッファーにコピーするには、より安全な関数 strcpy_s (または Unicode/MBCS 互換 _tcscpy_s) を使用します。 これは、次の例に示すように、文字を安全に変更できる場所です。

CString theString(_T("This is a test"));
int sizeOfString = (theString.GetLength() + 1);
LPTSTR lpsz = new TCHAR[sizeOfString];
_tcscpy_s(lpsz, sizeOfString, theString);
//... modify lpsz as much as you want   

注意

3 番目の引数にstrcpy_s(または Unicode、MBCS、-ノート_tcscpy_s) は、constwchar_t*(Unicode) またはconstchar*(ANSI)。 パス上の例は、CStringこの引数。 C++ コンパイラが自動的に定義された変換関数を適用、CString変換クラス、CStringにはLPCTSTR。 別に 1 つの型からキャスト操作を定義する機能は、C++ の最も有用な機能の 1 つです。

標準ランタイム ライブラリ文字列関数の使用

strcmp (Unicode/MBCS 互換を維持するときは _tcscmp) などの標準の C ランタイム ライブラリ文字列関数が使用できる文字列操作では、CString メソッドを使用できます。

C ランタイム文字列関数を使用する必要がある場合は、「C スタイルの Null で終わる文字列への変換 _core_using_cstring_as_a_c.2d.style_null.2d.terminated_string」で説明されている方法を使用できます。 CString オブジェクトを該当する C スタイルの文字列バッファーにコピーし、そのバッファーに対して必要な操作を実行した後、操作後の C スタイルの文字列を CString オブジェクトに割り当てることができます。

CString オブジェクトの内容の直接変更

ほとんどの場合、CString オブジェクトの内容を変更するか、CString を C スタイルの文字列に変換するときは、メンバー関数 CString を使用してください。

CString の内容を直接変更する方が効率的な場合があります (文字バッファーを必要とするオペレーティング システム関数を使用する場合など)。

GetBuffer メソッドと ReleaseBuffer メソッドを使用して、CString オブジェクトの内部文字バッファーを直接操作して変更できます。 これらの関数は次の手順で使用します。

GetBuffer と ReleaseBuffer を使用して CString オブジェクトの内部文字バッファーにアクセスするには

  1. CString オブジェクトに対して GetBuffer を呼び出し、必要な長さのバッファーを指定します。

  2. GetBuffer が返すポインターを使用して CString オブジェクトに直接文字を書き込みます。

  3. CString オブジェクトに対して ReleaseBuffer を呼び出し、CString のすべての内部状態情報 (文字列の長さなど) を更新します。 CString オブジェクトの内容を直接変更した後は、必ず ReleaseBuffer を呼び出してから、その他の CString メンバー関数を呼び出す必要があります。

可変個の引数リストを取る関数での CString オブジェクトの使用

C 関数の中には可変個の引数リストを取るものがあります。 代表的な例は printf_s です。 この種の関数の宣言方法では、コンパイラは各引数の型がわからないため、引数に対する適切な型変換を判定できません。 したがって、可変個の引数リストを取る関数に CString オブジェクトを渡すときは、明示的に型キャストによる変換を行う必要があります。

CString オブジェクトを可変個の引数を取る関数の中で使用するには、次の例に示すように、CStringLPCTSTR 文字列に明示的にキャストします。

CString kindOfFruit = _T("bananas");
int howmany = 25;
_tprintf_s(_T("You have %d %s\n"), howmany, (LPCTSTR)kindOfFruit);    

CString 仮パラメーターの正確な指定

多くの場合、関数に対して文字列引数を指定する最も良い方法は、関数プロトタイプの中で仮パラメーターの型として、CString ではなく、文字への const ポインター (LPCTSTR) 型を指定することです。 仮パラメーターの型として文字への const ポインターを指定すると、実パラメーターとしては TCHAR 配列へのポインター、リテラル文字列 ("hi there")、CString オブジェクトのどれでも使用できます。 CString オブジェクトは自動的に LPCTSTR に変換されます。 LPCTSTR が使用できる場所ならどこでも CString オブジェクトを使用できます。

引数が変更されない場合は、仮パラメーターとして定数文字列の参照 (constCString&) を使用することもできます。 文字列が関数で変更される場合は const 修飾子を省略します。 既定値として null 値を指定する場合は、null 文字列 ("") で初期化します。これらの仮引数の使い方を次に示します。

void AddCustomer(const CString& name, const CString& address, 
   const CString& comment = _T(""));

ほとんどの関数の戻り値では、CString オブジェクトを値によって返すことができます。

参照

概念

CString 引数の渡し方

その他の技術情報

文字列 (ATL/MFC)