2

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

在下面的程序中,控制台不会提示我输入第二个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 次”。代码有什么问题。任何帮助都会很棒。

4

3 回答 3

3

程序读取单词列表直到文件结束。因此,在终端上,您可以输入 EOF 字符(Ctrl-D在 Linux 上,Ctrl-Z Return在 Windows 上),但接下来呢?

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

取而代之的是,使用某种哨兵,或在其前面加上一个计数。这样,第一个循环可以运行到列表的逻辑末尾。然后它可以读取用于摘要逻辑的单词。

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;
于 2012-06-19T06:16:16.950 回答
2
while (cin>>x) 
{
    words.push_back(x);
}

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

cin.clear();
于 2012-06-19T06:12:15.757 回答
1

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

将此作为示例和可能的问题阅读!

于 2012-06-19T06:13:42.767 回答