下面的程序没有达到预期目标,哪里错了呢?我觉得好像是“cin>>ch”

发布网友

我来回答

2个回答

热心网友

while(cin>>ch) 应该是这个问题。
你的ch是个char,每次从cin读一char,这就导致,当你输入
完按回车时,回车也是一个char,是“\n”,所以你的cin》ch不会反回假,
cin只会在两种情况为假,一个是你的输入类型与变量类型不匹配,cin状态为假,另一种是eof 就是END-OF-FILE。cin 这个特殊实例有几个flag(好像是4个,具体的忘记了)储存它的状态,如果类型不匹配,cin会设置fail这个flag,如果是eof,它会设置eof这个flag,只要fail和eof其中一个flag被设置,cin都会返回假。这就是为什么有的时候需要cin.clear(),就是为了重置这些flag,否则的话cin永远为假。你不重置就用,就会出错。而在你的程序中,这两个flag都不会被设置,因为都没有错。missgya说的结束方法是因为在linux中ctrl+D代表eof,当你按回车然后按ctrl+D的时候,说明你输入了一个eof,当cin遇到eof是,就会设置eof flag,然后才会返回假,程序才能正确结束,否则的话应该会继续等待输入(我猜的,没试过)。这也是为什么你会看到他的程序输出结果第一行有一个***“字符(换行)
的次数等于1”****前面什么都没有。其实前面应该是一个回车符“\n”, 但是你看不见,因为它不会显示出来。

你可以去看iostram的标准函数库,应该会讲到我说的内容。windows的情况不太清楚,window的回车好想是两个字符“\r”"\n",具体对windows不太熟悉。 但是我很确定ctrl+Z 在windows中代表eof。

热心网友

程序没有错,关键是怎么结束输入的问题。
在Linux里,先输入一行字符串“hello,world! hello,again!”,然后按回车,然后按Ctrl-D,结束输入。以下是我在Linux里的运行结果。

请输入一行字符串(以回车结束):
hello,world! hello,again!
统计结果:
字符n的次数=1
字符i的次数=1
字符g的次数=1
字符a的次数=2
字符!的次数=2
字符d的次数=1
字符r的次数=1
字符w的次数=1
字符,的次数=2
字符o的次数=3
字符l的次数=5
字符e的次数=2
字符h的次数=2

在Windows里,结束输入的方法是按Ctrl-Z后再按一次回车。即输入“hello,world! hello,again!”,然后按回车,然后同时按住Ctrl和Z键,再按一次回车,就能结束输入了。追问

为什么会这样捏?

追答我在Windows里照你的输入,运行了一遍,结果如下:
请输入一行字符串(以回车结束):
ASDADWASJJuhsjadahdsadjq
^Z
统计结果:
字符q的次数=1
字符d的次数=3
字符a的次数=3
字符j的次数=2
字符s的次数=2
字符h的次数=2
字符u的次数=1
字符J的次数=2
字符W的次数=1
字符D的次数=2
字符S的次数=2
字符A的次数=3
Press any key to continue

看样子你的程序运行时,把回车符也打印出来了?
coutccountnext;
把p->c改成(int)(p->c),试下,如果第一个打印出来的值为10,那就是把回车也打印出来了。
我试验的环境是:
Linux,g++、终端
Windows Xp,VC2003和Dev-C++,结果都是上面的结果,很正常。

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com