输入内部 while 和向量

Input inside while and vectors

本文关键字:向量 while 内部 输入      更新时间:2023-10-16

这是一种向量的菜鸟方法。下面的程序非常简单,但我不明白我做错了什么。它很小,所以我相信阅读它不会是一个麻烦。它应该创建一个向量并向其添加字符串。然后在屏幕上打印字符串。如果字符串已打印,它将跳过它并转到下一个字符串。此外,如果字符串是不喜欢的单词之一(在这种情况下只有单词"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>>temp可能有什么问题; ?编辑: 当我运行程序时,while 循环似乎永远不会停止。我尝试过"失败"将字符串作为输入,以便cin>>temp;也会失败。 但是,无论我输入的数据类型如何,cin 似乎都不会失败。在stroustrup的书中,代码就是这样,这很奇怪,因为我遇到了无法确定的逻辑错误。 当我输入字符串以外的内容时,程序应该停止。然后while循环条件将失败,循环将结束,for循环将开始,给我留下一个不错的向量和一些字符串。 谢谢你的时间。

使用

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;
}