我注意到如果我的字符串为空,则char数组也不会变空。请参阅以下代码:
std::copy(strUsername.begin(), strUsername.end(), sRecord.m_strUsername);
sRecord.m_strUsername
是char[1064]
,但是如果它已经填充,我尝试copy
(或strcpy
)strUsername
为空,没有即使我希望sRecord.m_strUsername
变为空或只是成为strUsername
的任何内容,也会发生这种情况。
答案 0 :(得分:4)
你忘记了零终止符:
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
基本上会像我的第三个片段一样,但你必须自己将数组的最后一个元素归零。
答案 1 :(得分:1)
您可以使用strcpy
自动复制终止空字符,std::string::c_str
:
std::strcpy(sRecord.m_strUsername, strUsername.c_str());
因此,如果strUsername
为空(""
),则m_strUsername
在该通话后也将等于""
。