一个有意思的问题~~(此贴仅做讨论~ 没分)

r_swordsman 2004-12-27 03:15:55
#include "stdafx.h"
#include <string>
#include <iostream>
using namespace std;

int main()
{
// 提示: 如果'\0'输出的话, 会输出一个空格' '
string str = "123456789";
cout << str << "+" << endl;

str = "a\0b\0\0\0";
cout << str << "+" << endl;

str += '\0'; // 注意这里是单引号
cout << str << "+" << endl;

str += "\0";
cout << str << "+" << endl;

str += "\0\0";
cout << str << "+" << endl;

str += '\0c\0'; // 注意这里是单引号
cout << str << "+" << endl;

str += "\0d\0";
cout << str << "+" << endl;

str += "e";
cout << str << "+" << endl;

char c;
cin >> c;
}

/*
~~(此贴仅做讨论~ 没分)
大家不要运行~~先说出结果~~~
运行也可以~~
大家知道为什么吗????

为了计算空格数~~大家写出结果的时候请把空格替换成百分号'%'

*/
...全文
223 点赞 收藏 16
写回复
16 条回复
yjh1982 2004年12月28日
wstring才支持unicode
回复 点赞
cqsummer 2004年12月28日
看见这个例程是ANSI标准的..
可我找了tc,vc++,c++ buider..都不是ANSI标准的编译器...连string对象都用不了..
哪位大虾可指点小弟应该用什么编译器才是ANSI标准的..
回复 点赞
kevinmartin 2004年12月28日
经过仔细检查,其实这个问题是string结构的问题。

如果把string换成char[]就不行了。
通过设断点检查发现string结构中有一个叫Mysize的变量,这个变量保存的是这个string的有效字符长度。
123456789+ 9
a+ 1
a%+ 2
a%+ 2
a%+ 2
a%c+ 3
a%c+ 3
a%ce+ 4

原来他是这么做的:当添加一个string类型的变量或者char[]型的变量的时候,即"xxx",他会自动按照字符串处理,碰到\0就立刻结束,像str = "a\0b\0\0\0";,这个时候str中只有"a",后面的b并没有加入字符串,因为到第一个\0就结束了,并且这个时候这个string的长度(Mysize)是1。
但是当加的是一个字符的话,string类型并没有判断这个字符是不是\0,如果你尝试一下:
str += '\0'; // 注意这里是单引号
cout << str << "+" << endl;
str += '\0'; // 注意这里是单引号
cout << str << "+" << endl;
str += '\0'; // 注意这里是单引号
cout << str << "+" << endl;
str += '\0'; // 注意这里是单引号
cout << str << "+" << endl;
连续4遍,你就会发现输出的空格数在增加。因为这个时候string的Mysize变量的值在增加。

也就是说,string输出的时候是根据他里面的Mysize的值来看这个string到底有多长的。如果这么看来,这个可能算是一个小小的bug。但是考虑到输入中文字符的时候可能出现非结尾的\0,那么这种情况下,就不能碰到\0就结束了。我觉得微软可能是考虑到这个情况才使用了这种方法。string是可以支持unicode的。
回复 点赞
xc_lw 2004年12月28日
只学过一点C,没学过C++,using namespace std这句话是什么意思呀?
回复 点赞
r_swordsman 2004年12月28日
大家说的都不太对喔~~~ :)
答案是:(我把空格替换成百分号'%')
123456789+
a+
a%+
a%+
a%+
a%c+
a%c+
a%ce+


大家知道为什么吗???
回复 点赞
r_swordsman 2004年12月28日
kevinmartin(海魂)

牛人啊~~~分析的这么清楚~~~~~
回复 点赞
gaolouke 2004年12月27日
是不是因为输出的时候只输出到第一个'\0'?
回复 点赞
cqulzg 2004年12月27日
wsm?
回复 点赞
过客猫2020 2004年12月27日
无趣!
回复 点赞
fct0906 2004年12月27日
123456789
a
a
a
a
a
回复 点赞
fct0906 2004年12月27日
123456789
a
a
a
a
a
回复 点赞
kwwlkwwlfw 2004年12月27日
后面的应该只输入出:a+吧。。
回复 点赞
yjh1982 2004年12月27日
标准库的string 可以放任意多\0,而且算进string大小里.
回复 点赞
zhengwei1984222 2004年12月27日
有什么不对劲吗?
回复 点赞
xuelong_zl 2004年12月27日
不会,学习
回复 点赞
r_swordsman 2004年12月27日
有没有谁能说出为什么啊??
回复 点赞
发动态
发帖子
C++ 语言
创建于2007-09-28

3.1w+

社区成员

24.8w+

社区内容

C++ 语言相关问题讨论,技术干货分享
社区公告
暂无公告