我正在使用C++ 14,根据我的理解,C++ 11及更高版本中的std :: string以null字符结尾.我无法理解为什么以下代码不起作用.
string a="your";
char b[5];
for(int i=0; a[i]! ='\0';i++)
b[i] =a[i] ;
cout<<b;
Run Code Online (Sandbox Code Playgroud)
输出为:"yourul"(后跟2个随机字符)
问题是您没有将终结器复制到目标阵列.而是在遇到它时结束循环(不复制它).
在不知道用例或需要数组的情况下(很少有),不要像这样使用手动复制.如果出于某种原因,你不能使用如a.c_str()或者a.data()甚至&a[0],然后使用strncpy来代替:
strncpy(b, a.c_str(), sizeof b - 1); // -1 to leave space for the terminator
b[sizeof b - 1] = '\0'; // And make sure string is terminated
Run Code Online (Sandbox Code Playgroud)
请注意,std::string对象中现有终结符的保证取决于所使用的C++标准.在C++ 11之前,无法保证字符串中存在终结符.在实践中它仍然(为了简单起见),但规范没有保证.
因此,std::string确实有保证的序列返回的向后兼容性c_str(),并data()在0终结,并s[s.size()]给你一个NUL.(请注意,在任何这些终结符上写入都是未定义的行为.)
但是,您的代码有一个不同的错误:循环在遇到NUL时终止,并且不会将其复制到b.所以最后一个元素b有未指定的内容,并且读取它是未定义的行为.
不要自己编写复制循环.使用strlen或其中一种变体.或者更好的是,如果可能的话,根本不要使用可写的C风格的字符串.