只是尝试比较两个用户定义的向量,看它们是否相等,当前代码:
vector<int> ivec1, ivec2; //vectors, uninitialized
int temp1;
cout << "Enter integers to be stored in ivec1." << endl;
while(cin >> temp1) //takes input from user and creates new element in the vector to store it
{
ivec1.push_back(temp1);
}
int temp2;
cout << "Enter integers to be stored in ivec2." << endl;
while(cin >> temp2) //same as above with different vector
{
ivec2.push_back(temp2);
}
if(ivec1 == ivec2)
cout << "ivec1 and ivec2 are equal!" << endl;
else
cout << "ivec1 and ivec2 are NOT equal!" << endl;
到目前为止,它让我可以很好地为ivec1赋值,但是当我通过输入一个使cin失败的字母退出while循环时,它会跳过第二个while块 . 出于好奇,我尝试在第一个while循环之后输入其他cin语句,并且它也忽略了它们 .
迫使cin失败会导致程序忽略所有其他调用它或其他问题,还是有其他问题?如果是这样,我怎样才能让这个程序做我想做的事情?
截图为您的观赏乐趣:http://img695.imageshack.us/img695/2677/cinfailure.png
- PS . 有temp1和temp2只是我试图找出是否为两个赋值循环使用相同的int导致问题,无论如何我只是想我会留在那里
5 回答
当我遇到同样的问题时,我发现了这一点 . 我不得不添加
cin.clear()
和cin.ignore()
来重置循环之间的流并让它再次识别'cin'调用 .您必须执行
cin.clear()
才能重置流状态 . 然后,您必须确保从流中读取有问题的字符(使用here中描述的技术之一),以便下一个输入操作也不会失败 .你的意思是你做一个ctrl-D来为第一个循环提供文件结束 .
问题在于,一旦获得EOF,它将持续存在,第二个循环也将看到EOF并且从不读取任何内容 .
而是使用终止字符,如空行或'.',并专门测试玩具while循环而不是
while (cin >> tmp1)
在循环之间使用
cin.clear()
. 此命令将流的状态重置为可用的状态 .可能有助于知道你还是要
cin.clear()
(因为EOF仍然使流无效) - 但它并不危险当第一个
while
循环因std::cin
失败而退出时,它还会在内部设置失败标志 . 只需在第一个while
循环后写下以下内容即可清除该标志:它清除所有失败标志,以便
cin
可用于读取更多输入 .