C スタイルの文字列に関連する CString の操作方法
更新 : 2007 年 11 月
場合によっては、CString オブジェクトの内容を C スタイルの null で終わる文字列として扱う必要があります。ここでは、次のトピックについて説明します。
C スタイルの null で終わる文字列への変換
標準ランタイム ライブラリ文字列関数の使用
CString オブジェクトの内容の直接変更
可変個の引数リストを取る関数での CString オブジェクトの使用
CString 仮パラメータの正確な指定
C スタイルの Null で終わる文字列への変換
次の 2 つの方法があります。
最も簡単な方法は CString オブジェクトを LPCTSTR にキャストすることです。型変換演算子 LPCTSTR は、CString オブジェクトから C スタイルの null で終わる読み取り専用文字列へのポインタを返します。
LPCTSTR が返すポインタは CString オブジェクトが使用するデータ領域を指しています。CString オブジェクトがスコープからはずれて自動的に破棄されるか、ほかの理由によって CString オブジェクトの内容が変化すると、キャストによって得られた LPCTSTR 型ポインタは無効になります。このポインタが指す文字列は一時的なものです。
SetAt などの CString 関数を使用して、文字列オブジェクトの中の文字を個別に変更できます。ただし、より安全な関数 strcpy_s を使用して CString オブジェクトをコピーしてからコピー先に変更を加える方法もあります。Unicode/MBCS 対応を保つときは _tcscpy_s を使用します。この場合は、CString オブジェクトの内容を別のバッファにコピーして、バッファの内容に変更を加えます。次に例を示します。
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
メモ : strcpy_s (Unicode/MBCS 対応を維持するときは _tcscpy_s) の第 3 引数は constwchar_t* (Unicode) 型または constchar* (ANSI) 型です。上の例ではこの引数で CString を渡しています。C++ コンパイラは自動的に CString クラスで定義されている変換関数を使用して CString を LPCTSTR に型変換します。キャストによる型変換は C++ の最も強力な機能の 1 つです。
標準ランタイム ライブラリ文字列関数の使用
多くの場合、strcmp (Unicode/MBCS 対応を維持するときは _tcscmp) などの C ランタイム ライブラリ文字列関数が使用できる文字列操作においては CString メンバ関数が使用できます。
C ランタイム文字列関数を使用する必要がある場合は、前の「C スタイルの Null で終わる文字列への変換」で述べた方法を使用して、CString オブジェクトを C スタイル文字列バッファにコピーし、バッファに対して C 関数を適用してから、バッファの内容を CString オブジェクトに戻します。
CString オブジェクトの内容の直接変更
ほとんどの場合、CString オブジェクトの内容を変更するか、CString を C スタイルの文字列に変換するときは、メンバ関数 CString を使用してください。
ただし、文字バッファを必要とするオペレーティング システム関数を使用するような処理では、CString の内容を直接変更する方が効率的です。
メンバ関数 GetBuffer および ReleaseBuffer は CString オブジェクトの内部文字バッファを直接操作して変更できます。これらの関数は次の手順で使用します。
CString オブジェクトに対して GetBuffer を呼び出し、必要な長さのバッファを指定します。
GetBuffer が返すポインタを使用して CString オブジェクトに直接文字を書き込みます。
CString オブジェクトに対して ReleaseBuffer を呼び出し、CString の内部状態情報 (文字バッファの長さなど) を更新します。CString オブジェクトの内容を直接操作した後は、必ず ReleaseBuffer を呼び出してから、その他の CString メンバ関数による操作を続けます。
可変個の引数リストを取る関数での CString オブジェクトの使用
C 関数の中には可変個の引数リストを取るものがあります。代表的な例は printf_s です。この種の関数の宣言方法では、コンパイラは各引数の型がわからないため、引数に対する適切な型変換を判定できません。したがって、可変個の引数リストを取る関数に CString オブジェクトを渡すときは、明示的に型キャストによる変換を行う必要があります。
CString オブジェクトを可変個の引数リストを取る関数で使用するには
CString オブジェクトを明示的に LPCTSTR 文字列に型キャストします。次に例を示します。
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 オブジェクトを値によって返すことができます。