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   
    
    awkwbzyc.alert_note(ja-jp,VS.90).gifメモ :

    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 オブジェクトの内部文字バッファを直接操作して変更できます。これらの関数は次の手順で使用します。

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

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

  3. 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 オブジェクトを値によって返すことができます。

参照

概念

CString 引数の渡し方

その他の技術情報

文字列 (ATL/MFC)