只是尝试比较两个用户定义的向量,看它们是否相等,当前代码:
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导致问题,无论如何我只是想我会留在那里
答案 0 :(得分:4)
您必须执行cin.clear()
才能重置流状态。然后,您必须确保从流中读取有问题的字符(使用here中描述的技术之一),以便下一个输入操作也不会失败。
答案 1 :(得分:1)
你的意思是你做了一个ctrl-D来为第一个循环提供文件结尾。
问题在于,一旦获得EOF,它将持续存在,第二个循环也将看到EOF并且从不读取任何内容。
而是使用终止字符,例如空行或'。'并专门测试玩具while while循环而不是while (cin >> tmp1)
答案 2 :(得分:1)
在循环之间使用cin.clear()
。此命令将流的状态重置为可用的状态。
可能有助于知道您不必总是输入无效字符来退出循环,您也可以在控制台上使用(在Windows上)ctrl-z(在其他系统上使用ctrl-d),刺激EOF。你仍然需要cin.clear()
(因为EOF仍然使流无效) - 但它没有那么危险
答案 3 :(得分:0)
当第一个 while
循环因std::cin
失败而退出时,它还会在内部设置失败标志。只需在第一个while
循环之后编写以下即可清除该标志:
scin.clear();
清除所有失败标志,以便cin
可用于读取更多输入。
答案 4 :(得分:0)
我在解决同样的问题时发现了这一点。我必须添加cin.clear()
和cin.ignore()
来重置循环之间的流,并让它再次识别'cin'调用。