如果'input'是一个int,为什么cin.fail()会传递input = 100a?

时间:2016-02-02 22:22:20

标签: c++ iostream cin

id  |  video_id  | date
1   |  2         | 2016-02-01
2   |  1         | 2016-02-02

以上是代码,它适用于大多数字母数字组合,它拒绝用户输入,如a,10aa,1003abc等。但是,它在100a,100b等输入上传递。这可能是什么原因?

以下是快照中的输出 enter image description here

1 个答案:

答案 0 :(得分:1)

cin >> input一找到任何非数字就会停止阅读,因此“100a”被解释为两个标记:“100”和“a”。

“100”转换为int并退出while(std::cin.fail())循环。这留下了“a”坐在流中,以便下次阅读cin

快速解决这个问题的方法(快速编写和解释,如果输入容易出错则不是最快的执行)

std::string token;
while (true) // or a countdown to kick out the truly moronic
{
    cin >> token;
    try
    {
        return std::stoi(token);
    }
    catch (...) // don't really care why std::stoi failed
    {
    }
}

std::stoi documentation.

更快的方法,如果需要错误,请使用strtol or similar并跳过异常处理开销。