string类的data()与c_str()的区别
来源:互联网 发布:java 数组去重效率 编辑:程序博客网 时间:2024/06/06 01:32
cout<<"\n========================"<<endl;
//s) c_str() //将内容以C_string返回
{
string myStr1("Hello--------");
string myStr2("world!\n");
const char* pStr=(myStr1+myStr2).c_str();
printf(pStr);
printf("%d\n",pStr[strlen(pStr)]);
myStr1+="DEF\n";
printf(myStr1.c_str());
}
//t) data() //将内容以字符数组形式返回
{
string myStr("Hello world!\n");
const char* pStr=myStr.data();
printf(pStr);
printf("%d\n",pStr[strlen(pStr)]);
}
cout<<"\n========================"<<endl;
========================
Hello--------world!
0
Hello--------DEF
Hello world!
0
========================
请问string类的data()与c_str()的区别 [问题点数:20分,结帖人Dic4000]
收藏
- 账号:Dic4000
- 昵称:Dic4000
- 关注 博客空间
- 最新帖子:
- 离职后公司想把一个维护性质的项...
- Enyim Memcached Client 框架下...
- 请问 const char *str="abcdef" ...
- 取消关注
- 关注
- Dic4000
- Dic4000
- 本版等级:本版专家分:29
- 结帖率:99.71%
楼主 发表于: 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.
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.
- <iframe width="200" height="22" align="center,center" id="iframeu1636200_0" src="http://pos.baidu.com/vcem?rdid=1636200&dc=2&di=u1636200&dri=0&dis=0&dai=2&ps=981x396&dcb=BAIDU_SSP_define&dtm=HTML_POST&dvi=0.0&dci=-1&dpt=none&tsr=0&tpr=1472608531471&ti=%E8%AF%B7%E9%97%AEstring%E7%B1%BB%E7%9A%84data()%E4%B8%8Ec_str()%E7%9A%84%E5%8C%BA%E5%88%AB-CSDN%E8%AE%BA%E5%9D%9B-CSDN.NET-%E4%B8%AD%E5%9B%BD%E6%9C%80%E5%A4%A7%E7%9A%84IT%E6%8A%80%E6%9C%AF%E7%A4%BE%E5%8C%BA&ari=2&dbv=0&drs=3&pcs=1371x643&pss=1371x7834&cfv=20&cpl=2&chi=2&cce=true&cec=utf-8&tlm=1472608531&rw=643&ltu=http%3A%2F%2Fbbs.csdn.net%2Ftopics%2F100038356&ecd=1&psr=1371x857&par=1371x739&pis=-1x-1&ccd=24&cja=true&cmi=4&col=zh-CN&cdo=-1&tcn=1472608532&qn=559415ed0bc7c000&tt=1472608531117.483.1824.1824" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" vspace="0" hspace="0" style="margin: 0px; border: 0px currentColor; border-image: none; vertical-align: bottom;" allowtransparency="true"></iframe>
- 创投前沿技术分享会
- <iframe width="200" height="22" align="center,center" id="iframeu1636204_0" src="http://pos.baidu.com/vcem?rdid=1636204&dc=2&di=u1636204&dri=0&dis=0&dai=3&ps=981x904&dcb=BAIDU_SSP_define&dtm=HTML_POST&dvi=0.0&dci=-1&dpt=none&tsr=0&tpr=1472608531471&ti=%E8%AF%B7%E9%97%AEstring%E7%B1%BB%E7%9A%84data()%E4%B8%8Ec_str()%E7%9A%84%E5%8C%BA%E5%88%AB-CSDN%E8%AE%BA%E5%9D%9B-CSDN.NET-%E4%B8%AD%E5%9B%BD%E6%9C%80%E5%A4%A7%E7%9A%84IT%E6%8A%80%E6%9C%AF%E7%A4%BE%E5%8C%BA&ari=2&dbv=0&drs=3&pcs=1371x643&pss=1371x7834&cfv=20&cpl=2&chi=2&cce=true&cec=utf-8&tlm=1472608531&rw=643&ltu=http%3A%2F%2Fbbs.csdn.net%2Ftopics%2F100038356&ecd=1&psr=1371x857&par=1371x739&pis=-1x-1&ccd=24&cja=true&cmi=4&col=zh-CN&cdo=-1&tcn=1472608532&qn=85a2f14c333ac69e&tt=1472608531117.487.1795.1795" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" vspace="0" hspace="0" style="margin: 0px; border: 0px currentColor; border-image: none; vertical-align: bottom;" allowtransparency="true"></iframe>
对我有用[0]丢个板砖[0] 引用 | 举报 |
回复次数:20 编辑删除
管理 - 取消关注
- 关注
- sjin001
- sjin001
- 本版等级:本版专家分:32
- 结帖率:0%
#1 得分:0回复于: 2007-01-20 02:07:48
data指向自己 ;修改data就是修改自己;
c_str指向它所指的对象;修改了它,但不修改它所指的对象;
形象点, data是自身,c_str是镜子.
c_str指向它所指的对象;修改了它,但不修改它所指的对象;
形象点, data是自身,c_str是镜子.
对我有用[0]丢个板砖[0] 引用 | 举报 |
编辑删除
管理 - 取消关注
- 关注
- Dic4000
- Dic4000
- 本版等级:本版专家分:29
- 结帖率:99.71%
#2 得分:0回复于: 2007-01-20 02:32:01
两个都不能修改,以下是两个函数的声明
const char *data( ) const;
const char *c_str( ) const;
const char *data( ) const;
const char *c_str( ) const;
对我有用[0]丢个板砖[0] 引用 | 举报 |
编辑删除
管理 - 取消关注
- 关注
- fangrk
- fangrk
- 本版等级:本版专家分:18871
- 结帖率:98.53%
- 黄花2002年7月 C/C++大版内专家分月排行榜第二
#3 得分:0回复于: 2007-01-20 10:24:25
我也不是很清楚,感觉有点差不多。
c_str()不可能是镜子,镜子的成本太高了。
c_str()不可能是镜子,镜子的成本太高了。
对我有用[0]丢个板砖[0] 引用 | 举报 |
编辑删除
管理 - 取消关注
- 关注
- taodm
- taodm
- 本版等级:本版专家分:76504
- 结帖率:100%
- 黄花2007年4月 C/C++大版内专家分月排行榜第二
2007年3月 C/C++大版内专家分月排行榜第二
2007年2月 C/C++大版内专家分月排行榜第二
2007年1月 C/C++大版内专家分月排行榜第二
2006年12月 C/C++大版内专家分月排行榜第二
- 蓝花2007年9月 C/C++大版内专家分月排行榜第三
2007年8月 C/C++大版内专家分月排行榜第三
2006年11月 C/C++大版内专家分月排行榜第三
- 黄花2007年4月 C/C++大版内专家分月排行榜第二
#4 得分:0回复于: 2007-01-20 13:08:27
“没有保证会用traits::eos(),或者说'\0'来作字符串结束.”
并不是说一定不以\0结束。在很多stl版本中data和c_str是完全相同的。
但是,是“很多”,不是“所有”
并不是说一定不以\0结束。在很多stl版本中data和c_str是完全相同的。
但是,是“很多”,不是“所有”
对我有用[0]丢个板砖[0] 引用 | 举报 |
编辑删除
管理 - 取消关注
- 关注
- caocheng8230
- caocheng8230
- 本版等级:本版专家分:3440
- 结帖率:99.31%
#5 得分:0回复于: 2007-01-20 13:20:48
建议楼主看看C++03,上面有详细的描述.
对我有用[0]丢个板砖[0] 引用 | 举报 |
编辑删除
管理 - 取消关注
- 关注
- Sco_field
- Sco_field
- 本版等级:本版专家分:1341
- 结帖率:98.9%
#6 得分:5回复于: 2007-01-20 13:35:24
我的理解,不知道对不对:
string s("123456");
------
“123456”为字符串字面值,以null空字符结束,所以s本身的后面就有个'\0'字符吧
string s("123456");
------
“123456”为字符串字面值,以null空字符结束,所以s本身的后面就有个'\0'字符吧
对我有用[0]丢个板砖[0] 引用 | 举报 |
编辑删除
管理 - 取消关注
- 关注
- femalelover
- femalelover
- 本版等级:本版专家分:571
- 结帖率:100%
#7 得分:0回复于: 2007-01-20 14:04:08
一向都是用c_str(), 没用过data()
对我有用[0]丢个板砖[0] 引用 | 举报 |
编辑删除
管理 - 取消关注
- 关注
- v2002750
- v2002750
- 本版等级:本版专家分:1334
- 结帖率:97.44%
#8 得分:0回复于: 2007-01-20 17:22:32
未之闻也,学习
对我有用[0]丢个板砖[0] 引用 | 举报 |
编辑删除
管理 - 取消关注
- 关注
- htqx
- htqx
- 本版等级:本版专家分:1950
- 结帖率:94.92%
#9 得分:5回复于: 2007-01-20 18:01:24
data 是字符数组,里面有'\0'当然也不会删掉string的原则就是无视这个c字符串规则.
c_str 是产生c字符串,也就是即使没有'\0'结尾,她也会添加一个.
c_str 是产生c字符串,也就是即使没有'\0'结尾,她也会添加一个.
对我有用[0]丢个板砖[0] 引用 | 举报 |
编辑删除
管理 - 取消关注
- 关注
- wangmuqq88
- wangmuqq88
- 本版等级:本版专家分:77
- 结帖率:80%
#10 得分:0回复于: 2007-01-20 19:24:01
C/C++高级群20641933
对我有用[0]丢个板砖[0] 引用 | 举报 |
编辑删除
管理 - 取消关注
- 关注
- OOPhaisky
- OOPhaisky
- 本版等级:本版专家分:8911
- 结帖率:100%
- 蓝花2006年9月 C/C++大版内专家分月排行榜第三
#11 得分:0回复于: 2007-01-20 19:37:12
没用过,感觉因该没什么区别吧
对我有用[0]丢个板砖[0] 引用 | 举报 |
编辑删除
管理 - 取消关注
- 关注
- tuhuo
- tuhuo
- 本版等级:本版专家分:264
- 结帖率:93.75%
#12 得分:0回复于: 2007-01-20 20:11:14
说是这样说,可是有的实现是一样的
//....
// 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(); }
//....
// 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(); }
对我有用[0]丢个板砖[0] 引用 | 举报 |
编辑删除
管理 - 取消关注
- 关注
- Sco_field
- Sco_field
- 本版等级:本版专家分:1341
- 结帖率:98.9%
#13 得分:0回复于: 2007-01-21 13:32:46
没用过data()
对我有用[0]丢个板砖[0] 引用 | 举报 |
编辑删除
管理 - 取消关注
- 关注
- steedhorse
- 晨星
- 本版等级:本版专家分:58232
- 结帖率:100%
- 红花2003年6月 C/C++大版内专家分月排行榜第一
2002年5月 C/C++大版内专家分月排行榜第一
- 黄花2003年9月 C/C++大版内专家分月排行榜第二
2002年6月 C/C++大版内专家分月排行榜第二
2002年4月 C/C++大版内专家分月排行榜第二
- 蓝花2007年3月 C/C++大版内专家分月排行榜第三
2007年2月 C/C++大版内专家分月排行榜第三
2007年1月 C/C++大版内专家分月排行榜第三
2003年7月 C/C++大版内专家分月排行榜第三
- 红花2003年6月 C/C++大版内专家分月排行榜第一
#14 得分:5回复于: 2007-01-21 14:35:14
从C++标准上的解释来看,只有一点区别:
c_str()返回的指针保证指向一个size() + 1长的空间,而且最后一个字符肯定"\0";
而data返回的指针则保证指向一个size()长度的空间,有没有null-terminate不保证,可能有,可能没有,看库的实现了。
c_str()返回的指针保证指向一个size() + 1长的空间,而且最后一个字符肯定"\0";
而data返回的指针则保证指向一个size()长度的空间,有没有null-terminate不保证,可能有,可能没有,看库的实现了。
对我有用[0]丢个板砖[0] 引用 | 举报 |
编辑删除
管理 - 取消关注
- 关注
- allen1981813
- allen1981813
- 本版等级:本版专家分:1158
- 结帖率:98.2%
#15 得分:0回复于: 2007-01-21 14:48:49
支持如下:
steedhorse(晨星) ( ) 信誉:141 Blog 2007-01-21 14:35:14 得分: 0
从C++标准上的解释来看,只有一点区别:
c_str()返回的指针保证指向一个size() + 1长的空间,而且最后一个字符肯定"\0";
而data返回的指针则保证指向一个size()长度的空间,有没有null-terminate不保证,可能有,可能没有,看库的实现了。
steedhorse(晨星) ( ) 信誉:141 Blog 2007-01-21 14:35:14 得分: 0
从C++标准上的解释来看,只有一点区别:
c_str()返回的指针保证指向一个size() + 1长的空间,而且最后一个字符肯定"\0";
而data返回的指针则保证指向一个size()长度的空间,有没有null-terminate不保证,可能有,可能没有,看库的实现了。
对我有用[0]丢个板砖[0] 引用 | 举报 |
编辑删除
管理 - 取消关注
- 关注
- qhgary
- qhgary
- 本版等级:本版专家分:5166
- 结帖率:99.07%
#16 得分:0回复于: 2007-01-22 12:54:50
感觉确实有些多余.
对我有用[0]丢个板砖[0] 引用 | 举报 |
编辑删除
管理 - 取消关注
- 关注
- sdlyczl
- sdlyczl
- 本版等级:本版专家分:71
- 结帖率:100%
#17 得分:0回复于: 2007-01-24 09:51:16
哪位老大给个例子最好不过了
对我有用[0]丢个板砖[0] 引用 | 举报 |
编辑删除
管理 - 取消关注
- 关注
- ugg
- 逸学堂
- 本版等级:本版专家分:13571
- 结帖率:100%
- 红花2006年1月 C/C++大版内专家分月排行榜第一
- 黄花2006年5月 C/C++大版内专家分月排行榜第二
2006年4月 C/C++大版内专家分月排行榜第二
2006年3月 C/C++大版内专家分月排行榜第二
- 蓝花2006年2月 C/C++大版内专家分月排行榜第三
#18 得分:5回复于: 2007-01-24 10:31:54
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());
}
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());
}
对我有用[0]丢个板砖[0] 引用 | 举报 |
编辑删除
管理 - 账号:zjbirdman
- 昵称:zjbirdman
- 关注 博客空间
- 最新帖子:
- 在myeclipse下面开发Hibernate+...
- lomboz+jboss+eclipse配置j2ee项...
- 问个在任务管理器中杀死窗口的问...
- 取消关注
- 关注
- zjbirdman
- zjbirdman
- 本版等级:本版专家分:5
- 结帖率:93.23%
#19 得分:0回复于: 2007-01-24 21:36:20
mark
对我有用[0]丢个板砖[0] 引用 | 举报 |
编辑删除
管理 - 账号:chun4221
- 昵称:chun4221
- 关注 博客空间
- 最新帖子:
- 请高手指点,关于dlopen的问题
- 取消关注
- 关注
- chun4221
- chun4221
- 本版等级:本版专家分:10
- 结帖率:100%
#20 得分:0回复于: 2011-11-18 18:18:30
学习了
0 0
- string类的data()与c_str()的区别
- string的c_str()和data()有区别?
- string::c_str() 与 string::data() 区别
- string类c_str、data与\0使用
- C++基础---string类的data/c_str/copy
- 实战c++中的string系列--string与char*、const char *的转换(data() or c_str())
- String 类 的c_str()函数
- C++ string类中 .c_str() 和 .data() 区别
- C++ string类中 .c_str() 和 .data() 区别
- 关于string中data()和c_str()函数的几点区别
- string的c_str和data()的运用,转为const char *
- string中c_str()、data()、cpy(p,n)函数的用法
- string中c_str()、data()、copy(p,n)函数的用法
- string中c_str()、data()、copy(p,n)函数的用法
- 【STL】string中c_str()、data()函数的用法
- string中c_str()、data()、copy(p,n)函数的用法
- string中c_str()、data()、copy(p,n)函数的用法
- string中c_str()、data()、copy(p,n)函数的用法
- 打正式包混淆时遇到的坑,不要把依赖包里的model给混淆了,否则json解析的时候会找不到model,导致加载不出数据,都是null
- VC CString的用法大全
- Swift 控制流
- 批量检测Mysql复制状态的shell 脚本
- PHP手机归属地查询流程及数据获取格式化处理
- string类的data()与c_str()的区别
- 利用css3动画效果编写滑动按钮开关
- cf/Codeforces ECR16-D - Two Arithmetic Progressions-中国剩余定理
- First Unique Character in a String
- Java加密技术(四)——非对称加密算法RSA
- PHP手机归属地查询项目完结篇
- 自定义组件---瀑布流布局
- JSON--就是键值对
- h5拖放1