免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4981 | 回复: 7
打印 上一主题 下一主题

string的data()和c_str()行为一致啊,即使含\0也没有什么区别? [复制链接]

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:58:11
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-03-23 14:47 |只看该作者 |倒序浏览
下面这一小段代码,我发现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很长啊。

论坛徽章:
11
技术图书徽章
日期:2014-03-01 14:44:34天蝎座
日期:2014-05-21 22:11:59金牛座
日期:2014-05-30 17:06:14
2 [报告]
发表于 2012-03-23 14:53 |只看该作者
string s="abc \0 xyz";

这里已经被截断了,后面测试没意义了。。。

论坛徽章:
11
技术图书徽章
日期:2014-03-01 14:44:34天蝎座
日期:2014-05-21 22:11:59金牛座
日期:2014-05-30 17:06:14
3 [报告]
发表于 2012-03-23 15:05 |只看该作者

  1. std::string s = "abc " + std::string(1, '\0') + "xyz";
复制代码

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:58:11
4 [报告]
发表于 2012-03-23 15:15 |只看该作者
timespace 发表于 2012-03-23 15:05


(1)
我把代码改成了下面这样。现在size()和length都返回9,为什么呢? length应该返回4才对啊。
     string ss("abc \0 xyz",9);
     size_t len= ss.length();
     size_t size=ss.size();
     const char*pd=ss.data();
     const char*ps=ss.c_str();
(2)
而且,msdn上面说,如果一个string末尾没有\0,那么c_str()返回的时候会加上\0。
我觉得这句话严重有歧义,因为c_str()返回的就是string对象本身的的内存地址
如果在这个字串的末尾加上\0,岂不是等于改变了stirng对象本身了?

论坛徽章:
0
5 [报告]
发表于 2012-03-23 16:02 |只看该作者
asker160 发表于 2012-03-23 15:15
因为c_str()返回的就是string对象本身的的内存地址
何以见得?

论坛徽章:
14
巨蟹座
日期:2013-11-19 14:09:4615-16赛季CBA联赛之青岛
日期:2016-07-05 12:36:0515-16赛季CBA联赛之广东
日期:2016-06-29 11:45:542015亚冠之全北现代
日期:2015-07-22 08:09:472015年辞旧岁徽章
日期:2015-03-03 16:54:15巨蟹座
日期:2014-12-29 08:22:29射手座
日期:2014-12-05 08:20:39狮子座
日期:2014-11-05 12:33:52寅虎
日期:2014-08-13 09:01:31巳蛇
日期:2014-06-16 16:29:52技术图书徽章
日期:2014-04-15 08:44:01天蝎座
日期:2014-03-11 13:06:45
6 [报告]
发表于 2012-03-23 16:09 |只看该作者
(1) 2楼 和 3楼 已经说得很清楚了
(2) 新标准有新规定,既然你说的是旧标准,那么
    a) c_str()返回的就是string对象本身的的内存地址 ------ 旧标准没这么规定
    b) 改变了stirng对象本身了 ------ 即使改变了stirng对象的“位值”,也不代表改变了其“逻辑值”,看关键字 mutable

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:58:11
7 [报告]
发表于 2012-03-23 17:08 |只看该作者
bruceteen 发表于 2012-03-23 16:09
(1) 2楼 和 3楼 已经说得很清楚了
(2) 新标准有新规定,既然你说的是旧标准,那么
    a) c_str()返回的就 ...


你的意思是说,新标准c_str()返回的就是string对象本身的的内存地址?
我知道mutable的作用。

论坛徽章:
0
8 [报告]
发表于 2012-03-24 22:13 |只看该作者
大哥,stl 有源代码的,有疑惑直接看实现就知道了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP