代码之家  ›  专栏  ›  技术社区  ›  Rick Jim DeLaHunt

为什么不能通过设置std::cin.清除()输入错误后?

c++
  •  1
  • Rick Jim DeLaHunt  · 技术社区  · 6 年前

    我阅读了 https://en.cppreference.com/w/cpp/io/basic_ios/clear 试过这个:

    w

    #include <iostream>
    #include <string>
    
    int main()
    {
        double n = 5.0;
        std::cin >> n;
        std::cout << std::cin.bad() << "|" << std::cin.fail() << "\n";
        std::cout << "hello" << "\n";
        std::cin.clear();
        std::cout << std::cin.bad() << "|" << std::cin.fail() << "\n";
        std::cin >> n;   //Why can't I input again here?
        std::cout << "world" << "\n";
        std::cout << n << "\n";
    }
    

    我不明白为什么程序结束时不允许我再次输入,我想我已经使用了 std::cin.clear() 重置所有“失败”状态。

    1 回复  |  直到 6 年前
        1
  •  4
  •   Stephan Lechner    6 年前

    clear cin >> n 将再次读取相同的输入并再次失败。因此您将没有机会输入新的输入。

    您需要从缓冲区中提取错误字符(除了调用 cin.clear() ); 例如,使用, cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n') ,忽略每个字符,直到第一次出现 \n . 你也可以用 fgets ,但是-与 ignore - fgets公司 需要缓冲区来存储您实际上不感兴趣的字符。