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

Xle*_*lea 4 c++ string stl

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

C++标准对此有何看法?(可以?)

背景:至少Visual C++和gcc附带的实现没有此属性.考虑这个例子(参见这里的实例):

// 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;
}
Run Code Online (Sandbox Code Playgroud)

当然,没有str注意到的写入操作导致"问题".但这不是我的问题.我想知道关于这种行为的标准.

Lig*_*ica 8

你的理解是不正确的.有点.

std::string可能包含char有价值的s '\0'; 当你提取一个C字符串时,除了扫描\0s 之外你无法知道它有多长,这必然不能解释"二进制数据".

这是一个限制strlen,并std::string通过实际记住这个元数据作为char它知道被封装的s 的计数来"修复" .

标准并不需要"说"任何关于它的内容,除了它std::string::length给你字符串长度,无论char你插入字符串的s 值是多少,并且不禁止插入一个'\0'.相比之下,strlen定义为告诉你有多少chars存在直到下一个\0,这是一个根本不同的定义.

没有明确的措辞,因为没有必要.如果非常简单的规则有一个例外("有一个字符串;它有chars;它可以告诉你char它有多少个")那么将明确说明......而事实并非如此.

  • @Xlea:AFAIK标准中没有明确的声明"`str.length()`可能会给`std :: strlen(str.c_str())`"提供不同的答案.但是没有必要,因为你可以从函数的定义中解决它.`string :: length`定义为返回字符串中的字符数,而`strlen`定义为返回前0个字符的字符数. (4认同)
  • @Xlea:它不是也不需要明确指定.字符串接受`char`s(没有提及对它们的值的限制),字符串类可以告诉你字符串中`char`s的数量.没有任何措辞要声明"除了这个被破坏的方式与`strlen`一样,尽管事实上这个类的整个目的是改进可怕的C字符串语义".我不能证明是消极的! (2认同)