将固定长度的字符数组分配给字符串

时间:2012-08-13 12:59:20

标签: c++ string

我有一个固定长度的字符数组,我想分配给一个字符串。如果字符数组已满,则分配失败。我想到了使用可以提供n的分配,但忽略了\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

如何为两种情况正确地为字符串分配固定长度的字符数组?

6 个答案:

答案 0 :(得分:7)

使用assign的“对迭代器”形式。

str.assign(test1, std::find(test1, test1 + 4, '\0'));

答案 1 :(得分:2)

C ++中的字符缓冲区是 - 或者:它们是空终止的,或者它们不是(和固定长度)。因此不建议以您的方式混合它们。如果你绝对需要这个,除非达到最大长度或空终止符,否则似乎没有其他方法可以手动复制。

for (char const* i = test1; i != test1 + length and *i != '\0'; ++i)
    str += *i;

答案 2 :(得分:0)

你想要NULL终止固定长度吗?这是非常不寻常的,不推荐。你必须编写自己的函数和每个角色push_back

答案 3 :(得分:0)

对于第一种情况,当你执行str.assign(test1)和str.assign(test2)时,你的数组必须有/ 0,否则这不是“char *”字符串而你不能像这样将它分配给std :: string。

答案 4 :(得分:0)

看到了序列化评论 - 使用std::vector<char>std::array<char,4>或只是一个4字符数组或容器。

答案 5 :(得分:-1)

你的第二个'糟糕'的例子 - 打印出“Tet”的例子 - 实际上确实有效,但你必须小心如何检查它:

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

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

0000000   "   T   e  \0   t   "  \n
0000007