2

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

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

*附注。拥有 temp1 和 temp2 只是我试图弄清楚是否对两个分配循环使用相同的 int 会导致问题,无论如何我只是想我会把它留在那里

4

5 回答 5

4

您必须cin.clear()重置流状态。然后,您必须确保从流中读取违规字符(使用此处描述的技术之一),以便下一个输入操作也不会失败。

于 2011-07-28T14:58:53.007 回答
1

你的意思是你做一个 ctrl-D 为第一个循环提供文件结尾。

这样做的问题是,一旦达到 EOF,它将持续存在,并且第二个循环也将看到 EOF,并且永远不会读取任何内容。

而是使用终止字符,例如空行或“。” 并专门在玩具while循环中测试,而不是while (cin >> tmp1)

于 2011-07-28T14:58:55.187 回答
1

cin.clear()在循环之间使用。此命令将流的状态重置为可用状态。

知道您不必总是输入无效字符来退出循环可能会有所帮助,您还可以在控制台上使用(在 Windows 上) ctrl-z(在其他系统上为 ctrl-d),这会刺激 EOF . 您仍然必须这样做cin.clear()(因为 EOF 仍然会使流无效)-但这并不危险

于 2011-07-28T14:59:21.450 回答
0

当第一个 while循环因为 的失败而退出时std::cin,它也会在内部设置失败标志。您只需在第一个循环编写以下内容即可清除该标志:while

scin.clear();

它清除所有失败标志,以便cin可以用于读取进一步的输入。

于 2011-07-28T14:59:42.410 回答
0

当我解决同样的问题时,我发现了这一点。我必须在循环之间添加cin.clear()cin.ignore()重置流,让它再次识别“cin”调用。

于 2016-09-28T14:09:38.700 回答