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字符的字符串。

参考:string字符串末尾有\0吗?
C++ string 是否以‘\0’结尾 讨论

posted @ 2023-10-12 11:25  HDD-SG  阅读(242)  评论(0)    收藏  举报