STL basic_string长度为空字符

时间:2011-03-16 00:11:06

标签: c++ string stl stdstring

为什么你可以在std :: basic_string中插入一个'\ 0'字符,而.length()方法不会受到影响,但是如果你调用char_traits<char>::length(str.c_str()),你会得到字符串的长度,直到第一个'\ 0'字符?

e.g。

string str("abcdefgh");
cout << str.length(); // 8
str[4] = '\0';
cout << str.length(); // 8
cout << char_traits<char>::length(str.c_str()); // 4

1 个答案:

答案 0 :(得分:18)

很棒的问题!

原因是C样式字符串被定义为以空字节结尾的字节序列。当您使用.c_str()从C ++ std::string中获取C样式的字符串时,您将获得C ++字符串存储的序列,其后面带有空字节。当您将其传递给strlen时,它将扫描字节,直到它达到空字节,然后报告它之前找到的字符数。如果string包含空字节,那么strlen将报告一个小于字符串整个长度的值,因为它会在命中字符串的实际结束之前停止。

一个重要的细节是strlenchar_traits<char>::length不是同一个功能。但是,char_traits<charT>::length(第21.1.1节)的C ++ ISO规范表明char_traits<charT>::length(s)返回最小 ichar_traits<charT>::eq(s[i], charT())为真。对于char_traits<char>,如果通过进行eq比较来使两个字符相等,则==函数返回,并且通过写char()来构造字符会产生空字节,因此这等于说“字符串中的第一个空字节在哪里?”它本质上是strlen的工作原理,尽管两者在技术上是不同的功能。

C ++ std::string,然而,它是“任意字符序列”的更一般概念。其实现的细节隐藏在外部世界,尽管它可能由开始和停止指针或指针和长度表示。因为此表示不依赖于存储的字符,所以询问std::string的长度会告诉您有多少字符,无论这些字符实际是什么。

希望这有帮助!