C++ Primer 习题6.20的诡异有关问题
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相等了····