首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

C++ Primer 习题6.20的诡异有关问题

2012-03-26 
C++ Primer 习题6.20的诡异问题题目:从标准输入读入一系列string对象,知道同一个单词连续出现两次,或者所

C++ Primer 习题6.20的诡异问题
题目:从标准输入读入一系列string对象,知道同一个单词连续出现两次,或者所有的单词都已读完,才结束读取。输出重复出现的单词,或者输出没有任何单词连续重复出现的信息。
我的代码如下:

C/C++ code
#include <iostream>#include <string>using namespace std;int main(){    string prev, curr;    while (cin >> curr)    {        if (curr == prev)            break;        prev = curr;    }    if (prev == curr && !curr.empty())    {        cout << "Repeated word: " << curr << endl;    }    else    {        cout << "No repeated words." << endl;    }    return 0;}

为什么输入:
a
b
c
ctrl+z 的结果是: Repeated word: c
c明明只出现了一次啊?

[解决办法]
while (cin >> curr)
{
if (curr == prev)
break;
prev = curr;//只要输入成功 prev 和curr值一样导致下面的(prev == curr && !curr.empty())为真 lz自己debug一下就知道了

}

[解决办法]
因为你最后一次输入c结束后,字符c就被保存在了变量curr和变量prev中,结束循环后,就会执行下面的语句
if (prev == curr && !curr.empty())而且if的条件表达式是成立的,所以就输出了字符c
[解决办法]
刚开始prev和curr都为默认值,
输入a之后:while里面的第一次比较时(prev=为默认,curr=a);比较之后prev=a,curr=a;
输入b之后:第二次比较时prev=a,curr=b;比较之后prev=b,curr=b;
输入c之后:第三次比较时prev=b,curr=c;比较之后prev=c,curr=c;
ctrl+z结束while循环,并执行了后面的程序。
if (prev == curr && !curr.empty())
{
cout << "Repeated word: " << curr << endl;
}
所以结果是:c
[解决办法]
你输入c时,curr = char c;在跳出第一个循环时, 运行了prev = curr.

所以程序显示你重复了char c
[解决办法]
+++ 
因为在读取c的时候已经让curr和prev相等了····
探讨

while (cin >> curr)
{
if (curr == prev)
break;
prev = curr;//只要输入成功 prev 和curr值一样导致下面的(prev == curr &amp;&amp; !curr.empty())为真 lz自己debug一下就知道了

}

热点排行