C++中'\0'之于字符串
起因是web服务器中解析请求报文时在遇到\r\n就把\r\n设成\0,以此完成一行的解析。故思考,在C++中的字符串存储机制,\0是只做截断处理而不会真正的修改内存中的字符串排列,还是会直接丢弃其后面的字符。
实验:
#include <string>
#include <iostream>
using namespace std;
int main() {
const char* s = "hdsgfkdfl\0djskfh";
cout << s << endl;
cout << s+10 << endl;
cout << s[12] << endl;
string s1 = "hdsgfkdfl\0djskfh";
cout << s1 << endl;
cout << s1[12] << endl;
return 0;
}
结果:
hdsgfkdfl
djskfh
s
hdsgfkdfl
结论:使用string类型时似乎后面的数据消失了,而char* 类型则只起到了截断作用。
理论参考:
string 类的构造函数直接在\0处.end()。
std::string:标准中未规定需要\0作为字符串结尾。编译器在实现时既可以在结尾加\0,也可以不加。(因编译器不同)
但是,当通过c_str()或data()(二者在 C++11 及以后是等价的)来把std::string转换为const char *时,会发现最后一个字符是\0。但是C++11,string字符串都是以'\0'结尾。
为什么C语言风格的字符串要以'\0'结尾,C++可以不要?
c语言用char*指针作为字符串时,在读取字符串时需要一个特殊字符0来标记指针的结束位置,也就是通常认为的字符串结束标记。而c++语言则是面向对象的,长度信息直接被存储在了对象的成员中,读取字符串可以直接根据这个长度来读取,所以就没必要需要结束标记了。而且结束标记也不利于读取字符串中夹杂0字符的字符串。

浙公网安备 33010602011771号