2012-03-26 11 views
2

現在、私は小さなC++ツールを作成しています.C++での文字列の扱い方には驚いています。これは私がC++に対処する必要があるのは初めてですが、Java、C#などの強力な型を持つManaged言語の経験はかなりありますが、C++の文字列で怒っています。C++での文字列の操作に関するベストプラクティス

C++で文字列を操作するベストプラクティスはありますか?

「文字列」

TCHAR、char型*、LPWSTR、LPCSTR ...など の異なる種類を扱う、私のために多くの時間を取っている他に、各タイプの変換WIN API関数の多く実装する。

あるタイプを別のタイプに変換する際に、文字列を扱う方法を提案してください。 多分使用するライブラリがありますか?

+2

ベストプラクティス= RAII – Flexo

+14

使用のstd :: stringとstd :: wstring。 – Robinson

+1

@ロビンソンは何を言った。tchar、char *、LPWSTR、LPCSTRは実際の文字列ではなく、charの配列へのポインタです。 – Alexander

答えて

7

短答?私のアドバイスはどこでもstd::stringまたはstd::wstringを使用してください。

std::string strBuffer = "test"; 
strBuffer += " ... test"; 
std::string::size_type nStringSize = strBuffer.size(); 
const char* pszString = strBuffer.c_str(); // pszString contains 
               // pointer to memory held 
               // by STL string and can be 
               // passed into API calls 

あなたは簡単すなわちヌルへのポインタであるとして、あなたが最もWinAPIの関数に渡すことができます.c_str()によって文字列char*を終了(「Cスタイル」の文字列を取得することができます。

を他の種類のほとんどあなたは言及(tcharLPWSTRは、LPCSTRなど)(Cスタイルの配列、またはchar型またはポインタ)のCスタイルの配列へのtypedefは、マルチバイト文字セット上でUnicodeをサポートするためのものである。

+0

'char * pszString = strBuffer.c_str();' - 'const char *'から 'char *'への無効な変換 – Flexo

+0

ほとんどの場合、これで十分です。私は渡された文字列を変更する多くのAPI呼び出しを見たことはありません。もちろん、私はまだWindowsのすべてのAPI呼び出しに遭遇していないと確信しています;-) – Konrad

+0

@awoodland:それと奇妙ですハンガリー表記...ああ。 –

0

ロビンソン氏によると、管理言語に慣れていれば、最も便利な方法はSTDL文字列になります。 w ...はワイド(Unicodeの場合など)、wを指定しない場合は8ビットになります。

最も一般的なC++(またはそれ以上のC)の文字列は、メモリ内の文字シリーズへの単純なポインタであるchar*で、その後にヌルバイトの文字列\0が続きます。クラスの純粋なデータではないので、その長さなどの事前情報はありません。長さが必要なときは、\0が見つかるまで文字を繰り返して数えなければなりません。正確には、これはstrlen関数が行うことです。伝統的なstrのための他のヘルパー関数がたくさんあります...それらを切り取ったり、コピーしたり、連結したりしますが、元のメモリがメモリを割り当てた場合、文字列の後ろのデータを簡単に上書きすることができるという意味で "安全"十分ではありませんでした。これは90年代の大部分のウイルスによって悪用されました。

あなたが安全で便利な解決策を望むなら、標準のテンプレートライブラリストリングに行きます。

+3

"Wide"はUnicodeではありません。 –

+0

ありがとう、私はこの不正確さを修正しました。 – MrTJ

0

あるタイプを別のタイプに変換する際に、文字列を扱う方法を提案してください。多分使用するライブラリがありますか?

通常、C++では通常std::string(またはstd::wstring)を使用する必要があります。

1%になると、Cの文字列を処理する必要がある場合は、細心の注意が必要です。次に、char配列とtchar、char *、LPWSTR、LPCSTRの型へのポインタを処理する必要があります