首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

string的data()和c_str()行为一致啊即使含\0也没有什么区别?解决办法

2012-04-01 
string的data()和c_str()行为一致啊,即使含\0也没有什么区别?下面这一小段代码,我发现len和size竟然一样。s

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 的成员啊, 可以新拼凑一个字符串来返回, 没修改成员就没改变对象本身. 只是这样效率太低, 没人这样实现而已.
[解决办法]

C/C++ code
size_t length() const;
[解决办法]
vc的stl是P.J. Plauger版本的,其实现的data就是返回c_str

C/C++ code
    const _Elem *__CLR_OR_THIS_CALL data() const        {    // return pointer to nonmutable array        return (c_str());        }
[解决办法]
探讨

引用:
C/C++ code

size_t length() const;


string::length is an alias of string::size, returning both the exact same value.


C/C++ code

string ss("abc \0 xyz");


对s……

[解决办法]
string s="abc \0 xyz";
在s加载时就把右边当成"abc "加载,右边截断
至少要这样:
string s="abc xyz";
s[4] = '\0';
[解决办法]
length和size得到的结果是一样的。为什么会有这两个函数,size函数是所有容器都会提供的,vector,list但是length是string自身特有 。而strlen 是计算字符串的长度,计算结束的条件就是遇到结束符。和length,size完全是两码事

热点排行