【问题标题】:checking cin input, clearing input buffer检查cin输入,清除输入缓冲区
【发布时间】:2015-02-16 01:56:18
【问题描述】:

C++ 新手 - 尝试检查输入格式。什么都试过了,无计可施。任何帮助,将不胜感激。我已将我的问题分解为这个基本案例:

while(1) {
    cin >> x;
    cout << "asked!" << endl;
    cin.ignore(1000, 'n');
}

会导致“问!”的无限循环。在第一个无效输入之后(为 x 输入 not int)。我想处理不正确的输入。以下将不起作用:

do {
    cin.clear();
    cin >> x >> y;
    if (cin.fail()) 
    {
        cout << "Invalid input." << endl;
        cin.ignore(numeric_limits<streamsize>::max(), '\n');
    }

} while (cin.fail());

【问题讨论】:

    标签: c++ buffer cin typechecking


    【解决方案1】:

    您应该在std::cin.ignore() 之前使用std::cin.clear() 来清除流的错误状态,否则所有未来的cin 操作将退出/失败。也可以更直接的测试std::cin操作是否成功...

    do {
        if (std::cin >> x >> y) break;
        std::cout << "Invalid input, please try again...\n";
        std::cin.clear();
        std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
    } while (true);
    

    【讨论】:

    • cin.clear() 是我做的第一件事。你是说在别处做吗?
    • Yes... "alongside" 如在两者一起失败后,否则即使cin.ignore() 也会失败。稍作改写以使其更清晰。
    【解决方案2】:

    以下工作:

     do {
        if (cin >> customers >> chairs)
            break;
        if (cin.fail())
        {
            cout << "Invalid input." << endl;
            cin.clear();
            cin.ignore(numeric_limits<streamsize>::max(), '\n');
    
        }
    
    } while (true);
    

    感谢托尼 D

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多