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

时间:2014-11-20 07:44:33

标签: c++

你能不能在同一行中使用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);

1 个答案:

答案 0 :(得分:0)

cin >> array_size && array_size <= 1 || array_size >= 10 || cin.fail()

假设您在cin后面有一封信,cin >> array_size评估false,以便&&短路评估跳过array_size <= 1测试:

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

...除非出现未定义的行为 - 甚至可能是这样 - 否则循环将继续已从cin删除了该字母,只是立即再次失败。< / p>

检查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 input\n";
        exit(EXIT_FAILURE);
    }
    else
    {
        std::cin.clear();
        std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
    }
}