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 クラス用に定義されている変換関数を自動的に適用します。この関数は CStringLPCTSTR に変換します。 ある型から別の型へのキャスト操作を定義する機能は、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 オブジェクトの内部文字バッファーへのアクセスが提供され、これを使用して直接変更できます。 次の手順では、このような目的でこれらの関数を使用する方法を示します。

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

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

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

  3. ReleaseBuffer オブジェクトの CString を呼び出して、文字列の長さなどのすべての内部的な 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 オブジェクトを使用できます。

また、引数が変更されない場合は、仮パラメーターを定数文字列参照 (つまり、const CString&) として指定することもできます。 文字列が関数で変更される場合は、const 修飾子を省略します。 既定の null 値が必要な場合は、次に示すように、これを null 文字列 [""] に初期化します。

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

ほとんどの関数の結果では、単に値で CString オブジェクトを返すことができます。

関連項目

文字列 (ATL/MFC)
CString 引数渡し