读书人

请教string类的data()与c_str()的区别

发布时间: 2012-02-13 17:20:26 作者: rapoo

请问string类的data()与c_str()的区别
有人说:
data只是返回原始数据序列,没有保证会用traits::eos(),或者说 '\0 '来作字符串结束.
c_str是标准的做法,返回的char* 一定指向一个合法的用 '\0 '终止的C兼容的字符串。
但我写了个测试,发现转换后的字符串末尾都有 '\0 ',请问这两个成员函数到底有什么区别?应该在哪种场合下用哪一个?
string s( "123456 ");
const char *p=s.c_str();
const char *q=s.data();
int d;

for(int i=0;i <=s.size();i++) {d=*(p+i);cout < <d < <endl;}//最后一次输出的是0.
cout < <endl;
for(int i=0;i <=s.size();i++) {d=*(q+i);cout < <d < <endl;}//最后一次输出的也是0.


[解决办法]
我的理解,不知道对不对:

string s( "123456 ");
------
“123456”为字符串字面值,以null空字符结束,所以s本身的后面就有个 '\0 '字符吧

[解决办法]
data 是字符数组,里面有 '\0 '当然也不会删掉string的原则就是无视这个c字符串规则.

c_str 是产生c字符串,也就是即使没有 '\0 '结尾,她也会添加一个.


[解决办法]
从C++标准上的解释来看,只有一点区别:
c_str()返回的指针保证指向一个size() + 1长的空间,而且最后一个字符肯定 "\0 ";
而data返回的指针则保证指向一个size()长度的空间,有没有null-terminate不保证,可能有,可能没有,看库的实现了。
[解决办法]
string中的数据并没有保证被存储在独立的一块连续内存中,string的内部表示形式并没承诺以一个null字符结束。这解释了string 的成员函数c_str存在的原因,它返回一个按C风格设计的指针,指向string的值。因此我们可以这样传递一个string对象s给这个函数
void doSomething(const char *pString);
即使是字符串的长度为0,它都能工作。data并没有这个保证(也就是说返回字符串一定会以null结尾)

但是在实际编译器中,两者返回结果是相同的
以下是vs7.1下的两个函数的源码,可以清楚看到,data函数内部调用的c_str()
const _Elem *c_str() const
{// return pointer to null-terminated nonmutable array
return (_Myptr());
}

const _Elem *data() const
{// return pointer to nonmutable array
return (c_str());
}

读书人网 >C++

热点推荐