C スタイルの文字列に関連する CString
の操作方法
CString
オブジェクトには文字列データが含まれます。 CString
では、クラス テンプレート CStringT
で定義されているメソッドと演算子のセットを継承して、文字列データを操作します。 (CString
は、CString
でサポートされる種類の文字データを操作するように CStringT
を特化させた typedef
です)。
CString
は文字データを C スタイルの null で終わる文字列として内部的に格納しません。 代わりに、CString
は文字データの長さを追跡して、より安全にデータとそれに必要な領域を監視できるようにします。
CString
は C スタイルの文字列を受け入れ、C スタイルの文字列として文字データにアクセスする方法を提供します。 このトピックの次のセクションで、CString
オブジェクトを C スタイルの null で終わる文字列と同じように使用する方法について説明します。
C スタイルの null で終わる文字列としての CString
の使用
CString
オブジェクトを C スタイルの文字列として使用するには、オブジェクトを LPCTSTR
にキャストします。 次の例では、CString
は読み取り専用で C スタイルの null で終わる文字列へのポインターを返します。 strcpy
関数は、C スタイルの文字列のコピーを変数 myString
に入れます。
CString aCString = "A string";
char myString[256];
strcpy(myString, (LPCTSTR)aCString);
CString
メソッド (SetAt
など) を使用して、文字列オブジェクトの個々の文字を変更できます。 ただし、LPCTSTR
は一時的なポインターであり、CString
に対して変更が行われると無効になります。 CString
がスコープから外れ、自動的に削除されることもあります。 CString
オブジェクトを使用するたびに、オブジェクトの新しい LPCTSTR
ポインターを取得することをお勧めします。
場合によっては、直接変更するために CString
データのコピーが必要になる場合があります。 より安全な関数 strcpy_s
(または 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
Note
strcpy_s
(または Unicode/MBCS との移植性がある _tcscpy_s
) に対する 3 つ目の引数には、const wchar_t*
(Unicode) または const char*
(ANSI) のいずれかを指定します。 前述の例では、この引数に CString
を渡しています。 C++ コンパイラは CString
クラス用に定義されている変換関数を自動的に適用します。この関数は CString
を LPCTSTR
に変換します。 ある型から別の型へのキャスト操作を定義する機能は、C++ の最も有効な機能の 1 つです。
標準ランタイム ライブラリ文字列関数の操作
CString
などの標準 C ランタイム ライブラリ文字列関数 (または Unicode/MBCS との移植性がある strcmp
) を使用して検討対象の文字列操作を実行するために、_tcscmp
メソッドを検索できる必要があります。
C ランタイム文字列関数を使用する必要がある場合、「C スタイルの null で終わる文字列としての CString
の使用」で説明されている手法を利用できます。 CString
オブジェクトを同等の C スタイルの文字列バッファーにコピーし、そのバッファーに対して操作を実行してから、結果の C スタイルの文字列を CString
オブジェクトに割り当てることができます。
CString
の内容の直接変更
ほとんどの場合、CString
オブジェクトの内容を変更するか、または CString
を C スタイルの文字列に変換するには、CString
メンバー関数を使用する必要があります。
場合によっては、CString
の内容を直接変更する方が合理的であることがあります。たとえば、文字バッファーを必要とするオペレーティング システム関数を使用する場合などです。
GetBuffer
メソッドと ReleaseBuffer
メソッドでは、CString
オブジェクトの内部文字バッファーへのアクセスが提供され、これを使用して直接変更できます。 次の手順では、このような目的でこれらの関数を使用する方法を示します。
GetBuffer
と ReleaseBuffer
を使用して CString
オブジェクトの内部文字バッファーにアクセスする
GetBuffer
オブジェクトのCString
を呼び出して、必要なバッファーの長さを指定します。GetBuffer
によって返されたポインターを使用して、CString
オブジェクトに直接文字を書き込みます。ReleaseBuffer
オブジェクトのCString
を呼び出して、文字列の長さなどのすべての内部的な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
オブジェクトを使用できます。
また、引数が変更されない場合は、仮パラメーターを定数文字列参照 (つまり、const CString&
) として指定することもできます。 文字列が関数で変更される場合は、const
修飾子を省略します。 既定の null 値が必要な場合は、次に示すように、これを null 文字列 [""
] に初期化します。
void AddCustomer(const CString& name, const CString& address,
const CString& comment = _T(""));
ほとんどの関数の結果では、単に値で CString
オブジェクトを返すことができます。