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

Dic4000 2007-01-20 01:32:56
有人说:
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.
...全文
1765 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
chun4221 2011-11-18
  • 打赏
  • 举报
回复
学习了
逸学堂 2007-01-24
  • 打赏
  • 举报
回复
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());
}
sdlyczl 2007-01-24
  • 打赏
  • 举报
回复
哪位老大给个例子最好不过了
zjbirdman 2007-01-24
  • 打赏
  • 举报
回复
mark
qhgary 2007-01-22
  • 打赏
  • 举报
回复
感觉确实有些多余.
allen1981813 2007-01-21
  • 打赏
  • 举报
回复
支持如下:
steedhorse(晨星) ( ) 信誉:141 Blog 2007-01-21 14:35:14 得分: 0


从C++标准上的解释来看,只有一点区别:
c_str()返回的指针保证指向一个size() + 1长的空间,而且最后一个字符肯定"\0";
而data返回的指针则保证指向一个size()长度的空间,有没有null-terminate不保证,可能有,可能没有,看库的实现了。


晨星 2007-01-21
  • 打赏
  • 举报
回复
从C++标准上的解释来看,只有一点区别:
c_str()返回的指针保证指向一个size() + 1长的空间,而且最后一个字符肯定"\0";
而data返回的指针则保证指向一个size()长度的空间,有没有null-terminate不保证,可能有,可能没有,看库的实现了。
Sco_field 2007-01-21
  • 打赏
  • 举报
回复
没用过data()
fangrk 2007-01-20
  • 打赏
  • 举报
回复
我也不是很清楚,感觉有点差不多。
c_str()不可能是镜子,镜子的成本太高了。
tuhuo 2007-01-20
  • 打赏
  • 举报
回复
说是这样说,可是有的实现是一样的
//....
// This file is part of the GNU ISO C++ Library.....
//....
/**
* @brief Return const pointer to null-terminated contents.
*
* This is a handle to internal data. Do not modify or dire things may
* happen.
*/
const _CharT*
c_str() const { return _M_data(); }

/**
* @brief Return const pointer to contents.
*
* This is a handle to internal data. Do not modify or dire things may
* happen.
*/
const _CharT*
data() const { return _M_data(); }
OOPhaisky 2007-01-20
  • 打赏
  • 举报
回复
没用过,感觉因该没什么区别吧
wangmuqq88 2007-01-20
  • 打赏
  • 举报
回复
C/C++高级群20641933
htqx 2007-01-20
  • 打赏
  • 举报
回复
data 是字符数组,里面有'\0'当然也不会删掉string的原则就是无视这个c字符串规则.

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

v2002750 2007-01-20
  • 打赏
  • 举报
回复
未之闻也,学习
Dic4000 2007-01-20
  • 打赏
  • 举报
回复
两个都不能修改,以下是两个函数的声明
const char *data( ) const;

const char *c_str( ) const;
sjin001 2007-01-20
  • 打赏
  • 举报
回复
data指向自己 ;修改data就是修改自己;
c_str指向它所指的对象;修改了它,但不修改它所指的对象;

形象点, data是自身,c_str是镜子.
femalelover 2007-01-20
  • 打赏
  • 举报
回复
一向都是用c_str(), 没用过data()
Sco_field 2007-01-20
  • 打赏
  • 举报
回复
我的理解,不知道对不对:

string s("123456");
------
“123456”为字符串字面值,以null空字符结束,所以s本身的后面就有个'\0'字符吧
caocheng8230 2007-01-20
  • 打赏
  • 举报
回复
建议楼主看看C++03,上面有详细的描述.
taodm 2007-01-20
  • 打赏
  • 举报
回复
“没有保证会用traits::eos(),或者说'\0'来作字符串结束.”
并不是说一定不以\0结束。在很多stl版本中data和c_str是完全相同的。
但是,是“很多”,不是“所有”

64,648

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧