我注意到如果我的字符串为空,char 数组也不会变空。请看下面的代码:
std::copy(strUsername.begin(), strUsername.end(), sRecord.m_strUsername);
sRecord.m_strUsername
是一个 char[1064]
,但如果它已经被填充并且我尝试做一个复制
(或 strcpy
) 与 strUsername
为空,没有任何反应,即使我希望 sRecord.m_strUsername
变为空或只是成为任何 strUsername
是。
最佳答案
你忘记了零终止符:
std::copy(strUsername.begin(), strUsername.end(), sRecord.m_strUsername);
sRecord.m_strUsername[strUsername.size()] = '\0';
或者替代地
std::strcpy(sRecord.m_strUsername, strUsername.c_str() );
或者如果您希望数组中所有“未使用”的字符都是 \0
:
std::copy(strUsername.begin(), strUsername.end(), sRecord.m_strUsername);
std::fill(sRecord.m_strUsername + strUsername.size(),
sRecord.m_strUsername + 1064, '\0');
后者通常不是必需的,因为 C 风格的字符串通常被定义为类似 [sRecord.m_strUsername[0], first '\0' in the array)
的范围。 .第一个 \0
之后是什么通常无关紧要,除非您出于任何原因想要访问它。
范围[str.begin(), str.end())
只包含字符串的所有字符。 C 风格的字符串(又名 char
数组)需要额外的 '\0'
-终止符。
根据我的第一个和第二个建议的修复,范围 [sRecord.m_strUsername[0], first '\0' in the array)
将等于 strUsername
中的字符只要后者不包含任何额外的 '\0'
s(用 C 风格的字符串无法轻易处理的东西)。
在我的第三个建议固定后,数组中所有字符之后的每个字符都将是 \0
.
重要说明:在执行上述任何操作之前,您需要断言您的字符串最多包含 1063 个字符!如果不确定,如果假设不成立或使用 std::strncopy
则引发某种错误反而。 strncopy
基本上会像我的第三个片段一样,但你必须自己将数组的最后一个元素归零。
关于c++ - 字符串到字符数组不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29903564/