c++ - std::string 的 strlen(str.c_str()) 和 str.length() 之间的区别

标签 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 的写操作是导致“问题”的原因。但这不是我的问题。我想知道标准对这种行为有何看法。

最佳答案

你的理解有误。有点。

std::string 可能包含值为 '\0'char;当您提取 C 字符串时,除了扫描 \0 之外,您无法知道它有多长,这必然无法解释“二进制数据”。

这是 strlen 的限制,std::string 通过实际将此元数据记住为 char 的计数来“修复” >它知道的是封装的。

标准实际上不需要“说”任何关于它的东西,除了 std::string::length 给你字符串长度,不管 的值是多少char是你插入到字符串中的,也就是不禁止插入'\0'。相比之下,strlen 的定义是告诉您在下一个 \0 之前存在多少 char,这是一个根本不同的定义。

没有关于此的明确措辞,因为没有必要。如果非常简单的规则有异常(exception)(“有一个字符串;它有 char;它可以告诉你它有多少 char”)那么 < em>那 会被明确说明……但事实并非如此。

关于c++ - std::string 的 strlen(str.c_str()) 和 str.length() 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29302073/

相关文章:

c++ - 为什么我的计算出错了?

C++ 奇怪的 std::bad_alloc 异常

c++ - 对象数组作为链表中的字符数组——我关于对齐的假设是否有效?

python - 创建一个正方形

c++ - 根据输入数据创建 STL Vector - 标量或复杂类型

c++ - 如何计算 vector 的大小

c++ - 使用 std::sort 对依赖树进行排序

C++/STL 字符串 : How to mimic regex like function with wildcards?

python - 如何从文本文件导入(整数)列表的列表并以数学方式处理它们?

c++ - std::getline 不接受 std::back_insert_iterator