输入内部和向量

时间:2017-05-18 20:01:54

标签: c++ loops vector cin

这是向量的noob方法。以下程序非常简单,但我不明白我做错了什么。它很小所以我相信阅读它不会是一个麻烦。它应该创建一个向量并添加字符串。然后在屏幕上打印字符串。如果字符串已被打印,则会跳过它并转到下一个字符串。另外,如果字符串是不喜欢的单词之一(在这种情况下只有单词“left”),那么它也会跳过它。

#include <iostream>
#include <string>
#include <vector>

using namespace std;
int main()
{
    vector<string>words;
    string temp,disliked;
    disliked = "left";
    while(cin>>temp)
    {
    words.push_back(temp);
    }
    for(int i=0; i<words.size(); i++)
    {
        if(( i==0 || words[i] != disliked && words[i-1]!=words[i]))
        {
        cout << words[i] << endl;
        }
    }

return 0;
}

这个程序来自Stroustrup的书“使用c ++编程,原理和实践”。我使用了书中找到的代码,但是当我运行代码时,while循环似乎永远不会结束。 cin&gt;&gt; temp可能有什么问题; ? 的 修改 : 当我运行程序时,while循环似乎永远不会停止。我试过“failling”将字符串作为输入,以便 cin&gt;&gt; temp; 也会失败。 但无论我输入的数据类型如何,cin似乎永远不会失败。在stroustrup的书中,代码就是这样,这很奇怪,因为我遇到了我无法查明的逻辑错误。 当我输入其他字符串时,该程序应该停止。然后 while 循环条件将失败,循环将结束并且 for 循环将开始,留下一个漂亮的向量和几个字符串。 谢谢你的时间。

1 个答案:

答案 0 :(得分:0)

使用

if((words[i] != disliked && words[i-1]!=words[i]) || i==0)

是一个问题,因为i == 0||的第二个子句。在检查之前将访问words[-1],这会导致未定义的行为。

将其更改为:

if( (words[i] != disliked) && (i == 0 || words[i-1] != words[i]))

为了使您的代码更具可读性,请使用{}使块的范围更加清晰。

int main()
{
   vector<string>words;
   string temp,disliked;
   disliked = "left";

   cout << "bam" << endl;
   while(cin>>temp)
   {
      words.push_back(temp);
   }
   cout << "bam" << endl;

   for(int i=0; i<words.size(); i++)
   {
      if ( (words[i] != disliked) && (i == 0 || words[i-1] != words[i]) )
      {
         cout << words[i] << endl;
      }
   }

   return 0;
}