2

文字列に割り当てたい固定長の文字配列があります。文字配列がいっぱいの場合に問題が発生し、割り当てが失敗します。nただし、sを無視して指定できるところで代入を使用することを考え\0ました。例えば:

std::string str;
char test1[4] = {'T', 'e', 's', 't'};
str.assign(test1);    // BAD "Test2" (or some random extra characters)
str.assign(test1, 4); // GOOD "Test"
size_t len = strlen(test1); // BAD 5

char test2[4] = {'T', 'e', '\0', 't'};
str.assign(test2);    // GOOD "Te"
str.assign(test2, 4); // BAD "Tet"
size_t len = strlen(test2); // GOOD 2

どちらの場合も、固定長の文字配列を文字列に正しく割り当てるにはどうすればよいですか?

4

6 に答える 6

7

assign の「イテレータのペア」形式を使用します。

str.assign(test1, std::find(test1, test1 + 4, '\0'));
于 2012-08-13T13:15:31.270 に答える
2

C ++の文字バッファは、-または:nullで終了するか、そうでない(および固定長)かのいずれかです。したがって、それらをあなたのやり方で混合することはお勧めできません。これがどうしても必要な場合は、最大長またはヌルターミネータに達するまで、手動コピーに代わる方法はないようです。

for (char const* i = test1; i != test1 + length and *i != '\0'; ++i)
    str += *i;
于 2012-08-13T13:01:46.347 に答える
0

最初のケースでは、str.assign(test1) および str.assign(test2) を実行するときに、配列に /0 が必要です。そうしないと、これは "char*" 文字列ではなく、割り当てることができませんstd::string のように。

于 2012-08-13T13:03:27.010 に答える
0

シリアライゼーションのコメントを見ました - std::vector<char>std::array<char,4>、または 4 文字の配列またはコンテナーのみを使用してください。

于 2012-08-13T13:10:29.617 に答える
0

NULL 終端固定長の両方が必要ですか? これは非常に珍しいことであり、推奨されません。独自の関数とpush_back個々の文字を記述する必要があります。

于 2012-08-13T13:02:41.903 に答える
-1

2番目の「悪い」例-「Tet」を出力する例-は実際には機能しますが、チェック方法に注意する必要があります。

str.assign(test2, 4); // BAD "Tet"
cout << "\"" << str << "\"" << endl;

正確に 4 文字をコピーします。odLinux でoctal dump( ) を使用して実行すると、次のmy.exe | od -cようになります。

0000000   "   T   e  \0   t   "  \n
0000007
于 2012-08-13T13:20:20.830 に答える