为什么这段代码会导致无限循环?

6

当我输入正确的值(一个整数)时,一切正常。但是当我输入字符时,就会陷入无限循环。我已经检查了代码的每个方面,但找不到问题所在。为什么会发生这种情况?我在Windows上使用g++ 4.7。

#include <iostream>
#include <limits>

int main()
{
    int n;
    while (!(std::cin >> n))
    {
        std::cout << "Please try again.\n";
        std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
        std::cin.clear();
    }
}

输入:x
输出:

图片描述


当您输入时,是否存在像CR这样的不可打印字符,或者cin只获取一个字符? - bright-star
只需使用 scanf。更简单、更清晰。 - Joker_vD
@Joker_vD 但我以为这是C++... - template boy
scanf 不是任何东西的正确答案。 - Tim Pierce
@qwrrty 嗯,scanfcin >>稍微快一点(不确定为什么,它必须解析格式字符串),所以如果问题是“性能!1!!11elevenone”,那么这可能是答案。 - Joker_vD
2个回答

6
由于您的恢复操作顺序有误。请先清除错误,然后再清除缓冲区。
    std::cin.clear();
    std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');

谢谢。我甚至没注意到! :) - template boy
1
重点是,因为流处于错误状态,除非您首先清除错误,否则“忽略”也将失败。 - john

4

首先,您需要清除错误状态,然后再忽略无法解析的缓冲区内容。否则,在流不处于良好状态时,ignore 不会起作用。

另外,您还需要单独处理到达流的末尾。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接