gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:10:00 25 4
gpt4 key购买 nike

作为一种隐含的理解,我一直认为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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com