C++字符串中'\0'与"\0"的差异及表现差异原因咨询
为什么C++ std::string添加'\0'和"\0"的结果不同?
首先要明确:C++的std::string并不依赖空终止符(\0)来管理自身的长度,它内部有独立的成员变量记录字符串的实际长度,所以'\0'对std::string来说就是一个普通的ASCII值为0的字符,不会被当作字符串的终止标志。
接下来具体分析两种操作的差异:
test1 += "\0"的情况"\\0"是一个C风格字符串字面量,而C风格字符串的定义就是以第一个'\0'作为结束标志。当std::string的operator+=接收const char*类型的参数时,会从指针指向的位置开始读取字符,直到遇到第一个'\0'为止。
而"\0"这个字面量的第一个字符就是'\0',所以这个操作相当于往test1里添加了0个字符,最终test1.size()还是0。test2 += '\0'的情况'\0'是单个char类型的字符,std::string的operator+=接收char类型参数时,会直接将这个字符追加到字符串的末尾,完全不会因为它是'\0'而特殊处理。所以test2的长度会增加1,test2.size()输出1。
为什么打印test1和test2都显示空字符串?
当用cout打印std::string时,底层会调用std::string::c_str()方法获取C风格的字符串指针,而C风格字符串的输出逻辑是遇到第一个'\0'就停止。
test1本身是空字符串,输出自然为空;test2的第一个字符就是'\0',所以cout读取到第一个字符就终止输出,看起来也是空字符串。
内容的提问来源于stack exchange,提问作者Rahul Kumawat
相关产品推荐
相关产品推荐

