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 オブジェクトの内部文字バッファーにアクセスするには
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 オブジェクトを値によって返すことができます。