// ConsoleApplication25.cpp : main project file.
#include "stdafx.h"
#include <iostream>
#include <string>
#include <iomanip>
#include <ios>
#include <vector>
#include <algorithm>
using namespace System;
using namespace std;
int main()
{
vector<string> words;
string x;
cout << "Enter words followed by end of file: " << endl;
while (cin >> x){
words.push_back(x);
}
cout << endl;
int count=0;
string Uword;
cout << "Enter the word you want me to count" << endl;
cin >> Uword;
for(int i = 0; i < (int)words.size(); ++i){
if (Uword == words[i]){
++count;
}
}
cout << "You word appeared " << count << " times" << endl;
system("pause");
return 0;
}
有人可以告诉我我做错了什么吗? :/显然我不了解一个关键概念。该程序不断跳过我的第二个cin
。并且甚至没有看到for循环,我也不知道为什么。
答案 0 :(得分:0)
你的第一个while循环读取直到文件结束...文件结束后你的流状态设置了EOF位,这就是循环退出的原因。这也是为什么下一次cin >> Uword
尝试退出而不做任何事情的原因。如果你写了类似的东西......
if (!(cin >> UWord))
{
std::cerr << "unable to read uword from cin\n";
return 1;
}
...(通常是一个好习惯)你已经注意到了失败。
解决这个问题的典型方法是使用一个“哨兵”字来表示单词集的结尾...例如:
std::cout << "Enter valid words followed by the sentinel <END>:\n";
while (std::cin >> x && x != "<END>")
words.push_back(x);
之后阅读if
时,您肯定想要使用Uword
测试,这样您就可以在不看<END>
的情况下识别并处理点击EOF。
或者,首先让他们输入Uword
,然后让循环读取所有单词,直到EOF ....
值得注意的是,对于某些编译器/环境,cin
可以“体验”多个EOF ...例如,在Windows CMD.EXE提示符的空行上按Control-Z会生成EOF,但是如果您致电cin
重置EOF位,您可以继续阅读cin.clear()
。也就是说,如果您编写的程序依赖于此,则无法使用以下语句自动调用/使用/测试它们:
echo word1 word2 word3 word2 <END> word2 | ./word_counter_app
cat test_case_1 | ./word_couner_app
./word_couner_app < ./test_cast_2
这种调用很有用,即使你不关心可移植性,也最好避免尝试阅读后EOF。
答案 1 :(得分:0)
cin
将设置EOF。所以在你输入任何其他内容之前,你只需要清除它:
cin.clear();
cin >> UWord;