次の方法で共有


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   

[!メモ]

strcpy_s (または Unicode/MBCS 互換) _tcscpy_sへの 3 番目の引数は constwchar_t* (Unicode) または constchar* (ANSI) です。上の例のパスこの引数の CString。C++ コンパイラは LPCTSTRに CString を変換する CString のクラスごとに自動的に定義される変換関数を適用します。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)