2

我有一个固定长度的字符数组,我想分配给一个字符串。如果字符数组已满,则会出现问题,分配失败。我想过在你可以提供的地方使用assign,n但是忽略\0s。例如:

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

使用“一对迭代器”形式的赋值。

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

C++ 中的字符缓冲区是非此即彼的:要么以空结尾,要么不以空结尾(并且是固定长度)。因此不建议以您的方式混合它们。如果您绝对需要这个,在达到最大长度或空终止符之前,似乎没有其他选择可以手动复制。

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

您想要 NULL 终止固定长度?这是非常不寻常的,不推荐。您必须编写自己的函数和push_back每个单独的字符。

于 2012-08-13T13:02:41.903 回答
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 回答
-1

您的第二个“坏”示例-打印出“Tet”的示例-确实有效,但是您必须小心检查它的方式:

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

确实复制了四个字符。如果你od在 Linux 上通过八进制转储()运行它,使用my.exe | od -c你会得到:

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