首页 文章

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

提问于
浏览
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

  • PS . 有temp1和temp2只是我试图找出是否为两个赋值循环使用相同的int导致问题,无论如何我只是想我会留在那里

5 回答

  • 0

    当我遇到同样的问题时,我发现了这一点 . 我不得不添加 cin.clear()cin.ignore() 来重置循环之间的流并让它再次识别'cin'调用 .

  • 3

    您必须执行 cin.clear() 才能重置流状态 . 然后,您必须确保从流中读取有问题的字符(使用here中描述的技术之一),以便下一个输入操作也不会失败 .

  • 0

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

    问题在于,一旦获得EOF,它将持续存在,第二个循环也将看到EOF并且从不读取任何内容 .

    而是使用终止字符,如空行或'.',并专门测试玩具while循环而不是 while (cin >> tmp1)

  • 1

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

    可能有助于知道你还是要 cin.clear() (因为EOF仍然使流无效) - 但它并不危险

  • 1

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

    scin.clear();
    

    它清除所有失败标志,以便 cin 可用于读取更多输入 .

相关问题