【问题标题】:Why does this code give me an infinite loop?为什么这段代码给了我一个无限循环?
【发布时间】:2013-12-13 19:12:30
【问题描述】:

当我输入正确的值(整数)时,这很好。但是当我输入一个字符时,我得到一个无限循环。我查看了这段代码的每一面,但找不到问题。为什么会这样?我在 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 是否会抓取一个字符?
  • 只需使用scanf。更简单、更清晰。
  • @Joker_vD 但我认为这是 C++...
  • scanf 永远不是正确的答案。对任何东西。
  • @qwrrty 好吧,scanfcin &gt;&gt; 稍微快一点(不知道为什么,它必须解析格式字符串),所以如果问题是“性能!1!!11elevenone”,这可能就是答案。

标签: c++ loops infinite-loop


【解决方案1】:

这是因为您的恢复操作顺序错误。先清除错误再清除缓冲区。

    std::cin.clear();
    std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');

【讨论】:

  • 谢谢。我什至说不出来! :)
  • 重点是因为流处于错误状态ignore也会失败,除非你先清除错误。
【解决方案2】:

您必须先clear 错误状态,然后然后 ignore 无法解析的缓冲区内容。否则,ignore 将不会对状态不佳的流执行任何操作。

您将需要单独处理到达流的末尾。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-02-02
    • 2013-07-25
    • 1970-01-01
    • 1970-01-01
    • 2013-08-10
    • 2021-05-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多