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

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;
}

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

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

*/
...全文
278 16 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
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?
过客猫2022 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
  • 打赏
  • 举报
回复
有没有谁能说出为什么啊??

65,187

社区成员

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

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