我有一个固定长度的字符数组,我想分配给一个字符串。如果字符数组已满,则分配失败。我想到了使用可以提供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
如何为两种情况正确地为字符串分配固定长度的字符数组?
答案 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