字符串到字符数组不起作用
String to Char Array not working
我注意到如果我的字符串为空,char 数组也不会变空。请看下面的代码:
std::copy(strUsername.begin(), strUsername.end(), sRecord.m_strUsername);
sRecord.m_strUsername
是一个 char[1064]
,但如果它已经填充并且我尝试做一个 copy
(或 strcpy
),其中 strUsername
为空,什么也没有发生,即使我希望 sRecord.m_strUsername
变为空或者只是变成 strUsername
是什么。
您忘记了零终止符:
std::copy(strUsername.begin(), strUsername.end(), sRecord.m_strUsername);
sRecord.m_strUsername[strUsername.size()] = '[=10=]';
或者
std::strcpy(sRecord.m_strUsername, strUsername.c_str() );
或者如果您希望数组的所有 "unused" 个字符为 [=13=]
:
std::copy(strUsername.begin(), strUsername.end(), sRecord.m_strUsername);
std::fill(sRecord.m_strUsername + strUsername.size(),
sRecord.m_strUsername + 1064, '[=12=]');
后者通常不是必需的,因为 C 风格的字符串通常被定义为 [sRecord.m_strUsername[0], first '[=14=]' in the array)
这样的范围。第一个 [=13=]
之后的内容通常无关紧要,除非您出于某种原因想要访问它。
范围[str.begin(), str.end())
只包含字符串的所有字符。 C 风格的字符串(又名 char
数组)需要一个额外的 '[=18=]'
终止字符。
根据我的第一个和第二个建议的修复,范围 [sRecord.m_strUsername[0], first '[=14=]' in the array)
将等于 strUsername
中的字符,只要后者不包含任何额外的 '[=18=]'
s(某物你只是不能轻易地处理 C 风格的字符串。
根据我的第三个建议修复,数组中所有字符之后的每个字符都将是 [=13=]
。
重要说明:在执行上述任何操作之前,您需要断言您的字符串最多包含 1063 个字符!如果不确定,则在假设不成立或改用 std::strncopy
时引发某种错误。 strncopy
基本上会像我的第三个片段一样,但你必须自己将数组的最后一个元素归零。
您可以使用 strcpy
自动复制终止空字符,以及 std::string::c_str
:
std::strcpy(sRecord.m_strUsername, strUsername.c_str());
因此,如果 strUsername
为空 (""
),m_strUsername
也将在该调用后等于 ""
。
我注意到如果我的字符串为空,char 数组也不会变空。请看下面的代码:
std::copy(strUsername.begin(), strUsername.end(), sRecord.m_strUsername);
sRecord.m_strUsername
是一个 char[1064]
,但如果它已经填充并且我尝试做一个 copy
(或 strcpy
),其中 strUsername
为空,什么也没有发生,即使我希望 sRecord.m_strUsername
变为空或者只是变成 strUsername
是什么。
您忘记了零终止符:
std::copy(strUsername.begin(), strUsername.end(), sRecord.m_strUsername);
sRecord.m_strUsername[strUsername.size()] = '[=10=]';
或者
std::strcpy(sRecord.m_strUsername, strUsername.c_str() );
或者如果您希望数组的所有 "unused" 个字符为 [=13=]
:
std::copy(strUsername.begin(), strUsername.end(), sRecord.m_strUsername);
std::fill(sRecord.m_strUsername + strUsername.size(),
sRecord.m_strUsername + 1064, '[=12=]');
后者通常不是必需的,因为 C 风格的字符串通常被定义为 [sRecord.m_strUsername[0], first '[=14=]' in the array)
这样的范围。第一个 [=13=]
之后的内容通常无关紧要,除非您出于某种原因想要访问它。
范围[str.begin(), str.end())
只包含字符串的所有字符。 C 风格的字符串(又名 char
数组)需要一个额外的 '[=18=]'
终止字符。
根据我的第一个和第二个建议的修复,范围 [sRecord.m_strUsername[0], first '[=14=]' in the array)
将等于 strUsername
中的字符,只要后者不包含任何额外的 '[=18=]'
s(某物你只是不能轻易地处理 C 风格的字符串。
根据我的第三个建议修复,数组中所有字符之后的每个字符都将是 [=13=]
。
重要说明:在执行上述任何操作之前,您需要断言您的字符串最多包含 1063 个字符!如果不确定,则在假设不成立或改用 std::strncopy
时引发某种错误。 strncopy
基本上会像我的第三个片段一样,但你必须自己将数组的最后一个元素归零。
您可以使用 strcpy
自动复制终止空字符,以及 std::string::c_str
:
std::strcpy(sRecord.m_strUsername, strUsername.c_str());
因此,如果 strUsername
为空 (""
),m_strUsername
也将在该调用后等于 ""
。