作为一种隐含的理解,我一直认为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;。但这不是我的问题。我想知道标准对这种行为的看法。
答案 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'
。