字符串到Char数组不起作用

时间:2015-04-27 18:41:51

标签: c++ arrays string char std

我注意到如果我的字符串为空,则char数组也不会变空。请参阅以下代码:

std::copy(strUsername.begin(), strUsername.end(), sRecord.m_strUsername);

sRecord.m_strUsernamechar[1064],但是如果它已经填充,我尝试copy(或strcpystrUsername为空,没有即使我希望sRecord.m_strUsername变为空或只是成为strUsername的任何内容,也会发生这种情况。

2 个答案:

答案 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在该通话后也将等于""