首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++使用cin.fail(),cin.clear() --我有一个无限循环,不知道为什么

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

Stack Overflow用户
提问于 2014-11-20 07:44:32
回答 1查看 2.7K关注 0票数 0

您可以不使用cin和cin.fail()这样的一行吗?是否有一种更干净或更标准的方法来对输入进行这种类型的错误检查?

代码语言:javascript
复制
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());

这个方法很有效:

代码语言:javascript
复制
do {
    cout << "Please input #: ";
    if (cin.fail()){
        cin.clear();
        cin.ignore(80, '\n');
    }
    cin >> kids_total;
} while (cin.fail() || kids_total <= 0);
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-11-20 07:55:40

代码语言:javascript
复制
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

...unless有一些未定义的行为--甚至可能是那样--循环将继续进行,而不会删除cin中的字母,但会立即再次失败。

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

作为比较,这是相当健壮和IMHO直观,如果冗长。如果多做一次,只需创建一个函数.

代码语言:javascript
复制
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');
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27034299

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档