意料之外的无限循环

时间:2018-03-14 19:16:15

标签: c++

我偶然发现了这个无限循环。我应该检查用户的输入不是整数以外的任何类型,也不是负数。 为什么我会得到这个无限循环,更重要的是我如何对输入施加这些限制?

'use strict';
var myNewArray = Array(...[,,]);
console.log(myNewArray);

2 个答案:

答案 0 :(得分:2)

如果操作符>>由于输入与目标类型不匹配而失败,则字符将保留在流中(即使您清除了失败位)。 因此,如果您反复重复相同的读取操作,它将一次又一次地失败。通常,在这种情况下,您将跳过/忽略字符。以下示例直接取自Alex Harvey

int main()
{
    std::istringstream input("1\n"
                             "some non-numeric input\n"
                             "2\n");
    for(;;) {
        int n;
        input >> n;

        if (input.eof() || input.bad()) {
            break;
        } else if (input.fail()) {
            input.clear(); // unset failbit
            input.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); // skip bad input
        } else {
            std::cout << n << '\n';
        }
    }
}

答案 1 :(得分:1)

如果cin.fail()为真 - 我们很乐意进行循环

在第一次尝试读取两个失败的数字后,您清除状态并再试一次。这是没有阅读违规项目。由于数据留在流中,它必然会再次失败。

您需要添加逻辑,在读取失败时,您采取适当的操作 - 例如阅读有问题的数据