2012-05-11 496 views
0

文字列のサイズで初期化したいワイド文字変数があります。 私は次のように試みましたが、うまくいきませんでした。ワイド文字配列を初期化する

std::string s = "aaaaaaaaaaaaaaaaaaaaa"; //this could be any length 
const int Strl = s.length(); 
wchar_t wStr[Strl ]; // This throws error message as constant expression expected. 

これを達成するためにはどのようなオプションが必要ですか?この場合、mallocは動作しますか?

答えて

3

これはC++であるため、mallocの代わりにnewを使用してください。

C++はVLAをサポートしていないため動作しません。 (可変長配列)

配列のサイズはコンパイル時定数でなければなりません。すべての

wchar_t* wStr = new wchar_t[Strl]; 

//free the memory 
delete[] wStr; 
+0

あなたのために 'delete []'を実行するスマートポインタを使用してください。 –

3

まず、あなたがはちょうどワイド文字配列に文字列をコピーすることはできません - すべてはあなたに凶暴になるだろう。

std::stringcharで構築され、std::wstringwchar_tで構築されます。 stringwchar_t[]にコピーしても機能しません。 UTF8とUTF16で詳細を読んでください。

つまり、Luchianと言うと、VLAs can't be done in C++と彼のヒープ割り当てがトリックを行います。

しかし、私はに質問しなければなりません。理由はですか? std::stringを使用している場合、(ほとんど)文字配列を使用する必要はありません。私はあなたがパラメータとして文字配列/ポインタを取る関数に文字列を渡そうとしていると仮定します - 内容へのポインタを返す文字列の.c_str()関数について知っていますか?

+0

まあ、std :: stringは 'char'配列を保持しています。 'wchar_t'は' char'ではなくワイド文字です。おそらく、文字列をUNICODE表現に変換する必要があります。 –

+0

@ LuchianGrigore私は実際にそれを反映するために私の答えを更新しました。これが彼がやろうとしていることであれば、手動でバイトをコピーすることは失敗することが保証されます。 –

+0

まあ、私は彼がmemcpyでそれをやっていないことを願っています:) –

1
std::wstring ws; 
ws.resize(s.length()); 

これは目的に役立つwchar_tコンテナを提供し、概念的には可変長のコンテナです。できるだけC++でCスタイルの配列から離れようとすると、標準のコンテナはC apiライブラリとのインタフェースを含むあらゆる状況で請求書に適合します。文字列をcharからwchar_tに変換する必要がある場合、C++ 11ではwchar_tからcharに変換する文字列変換関数が導入されていますが、逆の動作をするかどうかはわかりません。

関連する問題