作为一种隐含的理解,我一直认为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
注意到的写入操作导致"问题".但这不是我的问题.我想知道关于这种行为的标准.
你的理解是不正确的.有点.
std::string
可能包含char
有价值的s '\0'
; 当你提取一个C字符串时,除了扫描\0
s 之外你无法知道它有多长,这必然不能解释"二进制数据".
这是一个限制strlen
,并std::string
通过实际记住这个元数据作为char
它知道被封装的s 的计数来"修复" .
标准并不需要"说"任何关于它的内容,除了它std::string::length
给你字符串长度,无论char
你插入字符串的s 值是多少,并且不禁止插入一个'\0'
.相比之下,strlen
定义为告诉你有多少char
s存在直到下一个\0
,这是一个根本不同的定义.
没有明确的措辞,因为没有必要.如果非常简单的规则有一个例外("有一个字符串;它有char
s;它可以告诉你char
它有多少个")那么这将明确说明......而事实并非如此.
归档时间: |
|
查看次数: |
7891 次 |
最近记录: |