stlen :: string的strlen(str.c_str())和str.length()之间的区别

时间:2015-03-27 13:40:19

标签: c++ string stl

作为一种隐含的理解,我一直认为std::string的每个实现都必须满足strlen(str.c_str()) == str.length()每个字符串str

C ++标准对此有何看法? (是吗?)

背景:至少Visual C ++和gcc附带的实现没有此属性。考虑这个例子(见here for a live example):

// Output:
// string says its length is: 13
// strlen says: 5
#include <iostream>
#include <cstring>
#include <string>

int main() {
  std::string str = "Hello, world!";
  str[5] = 0;
  std::cout << "string says its length is: " << str.length() << std::endl;
  std::cout << "strlen says: " << strlen(str.c_str()) << std::endl;
  return 0;
}

当然,没有str注意的书写操作导致了问题&#34;。但这不是我的问题。我想知道标准对这种行为的看法。

3 个答案:

答案 0 :(得分:8)

您的理解不正确。排序。

std::string可能包含值为char的{​​{1}};当你提取一个C字符串时,你无法知道除了扫描'\0'之外还有多长时间,这必然不能解释&#34;二进制数据&#34;。

这是\0的限制,strlen&#34;修复&#34;通过实际记住这个元数据作为它知道被封装的std::string的计数。

标准并不真正需要&#34;说&#34;关于它的任何事情,除了char给你字符串长度,无论你插入字符串的std::string::length的值是多少,并且不禁止插入char 。相比之下,'\0'定义为告诉您在下一个strlen之前存在多少char,这是一个根本不同的定义。

没有明确的措辞,因为没有必要。如果非常简单的规则有例外(&#34;有一个字符串;它有\0 s;它可以告诉你它有多少char&#34;)然后 将明确说明......而且它不是。

答案 1 :(得分:2)

标准C函数std::strlen根据数组中终止零的存在计算字符数组的长度。 另一方面,类std::string的对象可能嵌入了零。因此,应用于c_str()的函数strlen可以产生与成员函数长度返回的值不同的结果。

考虑一个简单的例子

std::string s( 10, '\0' );

std::cout << s.length() << std::endl;
std::cout << std::strlen( s.c_str() ) << std::endl;

在这种情况下,第一个输出语句将输出10,而第二个输出语句将输出0。

此外,如果你有一个像

这样的字符串
std::string s( "Hello" );

然后调用成员函数调整大小

s.resize( 10 );

然后该函数将原始字符串附加四个类型为char()的值,该值为零。成员函数s.length()返回10.

答案 2 :(得分:1)

标准对字符串

中的length()进行了说明
  

返回:size()。

size()定义为

  

返回:字符串中当前字符串对象数的计数。

因为你可以看到你将获得字符串中char字符对象的数量,即使char like objects值是'\0'