string的data()和c_str()行为一致啊,即使含\0也没有什么区别?
下面这一小段代码,我发现len和size竟然一样。
string s="abc \0 xyz";
size_t len=s.length();
size_t size=s.size();
const char*pd=s.data();
const char*ps=s.c_str();
网上不是说data函数会忽略\0么? 可是既然返回的是const char*这个忽略\0的操作具体意义在哪里?
而且为什么size和length都是4? 明明s很长啊。
[解决办法]
所谓的忽略,不是说忽略数据本身的。而是说最终返回的字符串 这个函数不会在字符串的尾部添加结束符
[解决办法]
size 和 length 是一样的. 只是 size 用于体现 string 是一个容器, 而 length 更具有字符串的语义.
至于 '\0' 的问题在于你构造的时候用的那个字符串, 构造的时候已经把 '\0' 后面的去掉了. 后面怎么操作都一样. 如果你想让字符产里包含 '\0' 可以这样构造:
string s= string("abc \0 xyz", 9);
[解决办法]
1. size 和 length 的实现完全一样, 没有区别. 只是在不同的场合满足特定的语意而已.
就像问年龄可以问贵庚也可以问多少岁一样, 是一个意思, 只是一个用于正式场合, 一个用于普通场合. size 和 length 也是完全一样, 只是一个用在把 string 当容器使用时, 一个用于把它当字符串使用时.
2. c_str() 的返回值不一定就是 string 的成员啊, 可以新拼凑一个字符串来返回, 没修改成员就没改变对象本身. 只是这样效率太低, 没人这样实现而已.
[解决办法]
size_t length() const;
[解决办法]
vc的stl是P.J. Plauger版本的,其实现的data就是返回c_str
const _Elem *__CLR_OR_THIS_CALL data() const { // return pointer to nonmutable array return (c_str()); }
[解决办法]