C++ 使用 cin.fail(), cin.clear() ---我有一个无限循环,不知道为什么

C++ Using cin.fail(), cin.clear() --- I have an infinite loop and don't know why

本文关键字:cin 有一个 无限循环 为什么 不知道 使用 C++ clear fail      更新时间:2023-10-16

你能不能像这样在同一行中使用 cin 然后使用 cin.fail()?有没有一种更干净或更标准的方法来在输入时进行这种类型的错误检查?--也许不使用 do-while。

do {
     cin.clear();
     cout << "nPlease enter the size of the array (1-10): ";
} while (cin >> array_size && array_size <= 1 || array_size >= 10 || cin.fail());

这个工作:

do {
    cout << "Please input #: ";
    if (cin.fail()){
        cin.clear();
        cin.ignore(80, 'n');
    }
    cin >> kids_total;
} while (cin.fail() || kids_total <= 0);
cin >> array_size && array_size <= 1 || array_size >= 10 || cin.fail()

假设你在 cin 中有一个字母,cin >> array_size评估false,因此&&短路评估跳过array_size <= 1进行测试:

  • array_size >= 10:可能是未初始化的内存读取==>未定义的行为,否则可能false
  • cin.fail() - 绝对true

。除非有未定义的行为 - 甚至可能如此 - 循环将继续而不会从cin中删除字母,只是立即再次失败。

检查cin.ignore是否有一种方法来删除解析失败的输入,或者使用 std::getline(std::cin, my_string)std::istringstream iss(my_string); if (iss >> array_size 等来保证整行被错误输入丢弃的方法。


相比之下,这是非常强大的,恕我直言,如果冗长,也很直观。 如果多次这样做,只需创建一个函数....

while (true)
{
    std::cout << "Please input #: ";
    if (std::cin >> kids_total)
    {
        if (kids_total > 0)
            break;
        std::cout << "Value must be > 0, please try again.n";
    }
    else if (std::cin.eof())
    {
        // rare for keyboard input - e.g. ^D on UNIX/Linux, ^Z Windows
        // can happen with pipes/redirects - e.g. echo 10 20 | ./my_app
        std::cerr << "expected value for kids_total but encountered end of inputn";
        exit(EXIT_FAILURE);
    }
    else
    {
        std::cin.clear();
        std::cin.ignore(std::numeric_limits<std::streamsize>::max(), 'n');
    }
}
相关文章: