这是向量的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 循环将开始,留下一个漂亮的向量和几个字符串。 谢谢你的时间。
答案 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;
}