[英]Assign a fixed length character array to a string
我有一个固定长度的字符数组,我想分配给一个字符串。 如果字符数组已满,则分配失败。 我想过使用你可以提供n
的assign,但忽略了\\0
s。 例如:
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
如何为两种情况正确地为字符串分配固定长度的字符数组?
使用assign的“对迭代器”形式。
str.assign(test1, std::find(test1, test1 + 4, '\0'));
C ++中的字符缓冲区是 - 或者:它们是空终止的,或者它们不是(和固定长度)。 因此不建议以您的方式混合它们。 如果你绝对需要这个,那么除非达到最大长度或空终止符,否则似乎没有其他方法可以手动复制。
for (char const* i = test1; i != test1 + length and *i != '\0'; ++i)
str += *i;
你想要NULL终止和固定长度? 这是非常不寻常的,不推荐。 你必须编写自己的函数并push_back
每个角色。
对于第一种情况,当你执行str.assign(test1)和str.assign(test2)时,你的数组必须有/ 0,否则这不是“char *”字符串,你不能将它分配给像这样的std :: string。
看到你的序列化注释 - 使用std::vector<char>
, std::array<char,4>
,或只是一个4字符数组或容器。
你的第二个“坏”例子 - 打印出“Tet”的例子 - 实际上确实有效,但你必须要小心你如何检查它:
str.assign(test2, 4); // BAD "Tet"
cout << "\"" << str << "\"" << endl;
确实复制了四个字符。 如果你通过Linux上的八进制转储( od
)运行它,请使用my.exe | od -c
my.exe | od -c
你会得到:
0000000 " T e \0 t " \n
0000007
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.