在EOF之后重用std :: cin

时间:2012-06-19 06:07:43

标签: c++

下面的代码用于在std::vector中存储一组单词,并通过将其与存储在向量中的所有单词进行比较来计算用户给出的特定单词出现在向量中的次数。 / p>

控制台不会在下面的程序中的第二个std::cin >>提示我输入。

#include <iostream>
#include <ios>
#include <iomanip>
#include <vector>
#include <algorithm>
using namespace std;

int main(int argc, const char * argv[])
{
   cout<<"enter your words followed ny EOF"<<endl;
   vector<string> words;
   string x;
   typedef vector<string>::size_type vec_size;
   vec_size size;
   while (cin>>x) 
   {
     words.push_back(x);
   }
   size=words.size();
   cin.clear();

   //now compare
   cout<<"enter your word:"<<endl;
   string my_word;
   int count=0;

   cin>>my_word;              //didn't get any prompt in the console for this 'cin' 
   for (vec_size i=0; i<size; ++i) 
   {
      my_word==words[i]?(++count):(count=count);
   }
   cout<<"Your word appeared "<<count<<" times"<<endl;
   return 0;

}

我得到的最终输出是“你的单词出现了0次”。 代码有什么问题。任何帮助都会很棒。

3 个答案:

答案 0 :(得分:2)

while (cin>>x) 
{
    words.push_back(x);
}

在这里,你一直在阅读直到失败。因此,当此循环结束时,cin处于错误状态。您需要清除错误状态:

cin.clear();

答案 1 :(得分:1)

http://www.cplusplus.com/forum/articles/6046/

请阅读此示例和可能的问题!!

答案 2 :(得分:1)

程序读取单词列表直到文件结尾。因此,在终端上,您可以在Windows上键入EOF字符(Linux上的 Ctrl-D Ctrl-Z 返回),但是然后?

我认为重置流后,终端会继续读取。但是如果程序从磁盘文件,管道等中获取输入,那就没有希望了。文件结束是永远的。

相反,使用某种哨兵,或者以计数为前缀。这样,第一个循环可以运行直到列表的逻辑结束。然后它可以读取用于摘要逻辑的单词。

while (cin>>x  &&  x != '*')   // The word "*" ends the list of words
   {
     words.push_back(x);
   }
   size=words.size();

   //now compare
   cout<<"enter your word:"<<endl;