在while循环中滥用cin以进行int赋值

时间:2011-07-28 14:55:28

标签: c++ loops while-loop cin

只是尝试比较两个用户定义的向量,看它们是否相等,当前代码:

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 个答案:

答案 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'调用。