2018.04.06 | C与C++ | 4646 浏览 | 0 赞 | 0 条评论


请注意,本文编写于 2184 天前,最后修改于 1436 天前,其中某些信息可能已经过时。
AI摘要:在C++中,使用cin进行输入时,需要对异常值进行处理并清理缓冲区。常见的清理方法有cin.clear()、cin.ignore()、cin.sync()和fflush(stdin),但它们都有各自的缺点。理想的解决方案是混合使用cin.ignore(INT_MAX, '\n')和cin.clear()。cin.clear()将置位置回,避免陷入cin.fail()的死循环;cin.ignore(INT_MAX, '\n')舍弃用户输入的多个字符,避免重复输出错误信息。示例代码已给出。参考:https://stackoverflow.com/questions/257091/how-do-i-flush-the-cin-buffer

Powered by AISummary and MoonShot Kimi Chat.

C++在用cin做输入的时候,尤其是需要输入int型值的时候,往往需要做验证与处理。而对于异常值,则需要先清理缓冲区,再准备下一次输入。

对于清理缓冲区,中文世界的方法有一下几种(或者混着用):

cin.clear();
cin.ignore();
cin.sync();
fflush(stdin);

但是这几种方法都各有各的缺点,不是会造成重复输出错误信息,就是会造成不断的死循环。真正理想的解决方案,StackOverflow上给了很好的解答。那就是混合使用cin.ignore(INT_MAX, 'n')和cin.clear().

cin.clear()负责将置位置回,所有没有此步的解决方案都会陷入到cin.fail()的死循环中;
cin.ignore('INT_MAX','n')负责将用户所一次性输入的多个字符全部舍弃,缺少第0个参数会使得错误信息持续输出(如果输入qwer则会输出四遍错误信息),缺少第1个参数则会忽略用户之后输入的全部信息(即使输对也没有反应)

示例代码如下:

while(true){
    cin >> cmd;
    if (cin.fail() || cmd < 0 || cmd > FUNC_NUM) {
        cin.clear();
        cin.ignore(INT_MAX,'\n');
        cout << "不合法的输入,请重新输入: ";
        continue;
    }else break;
}

参考资料

https://stackoverflow.com/questions/257091/how-do-i-flush-the-cin-buffer

本文链接:https://www.idealclover.top/archives/338/

本作品由 idealclover 采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可,转载请注明出处。

标签: 输入

0

没有评论 T^T


🤔关于我
翠翠 idealclover
Product Manager @ByteDance
南京大学 2016 级本科生
了解更多
🏠关于博客
基于 Typecho 博客框架
使用个人的 clover clover 主题