5

C++ cin清理缓冲区 - idealclover

 2 years ago
source link: https://idealclover.top/archives/338/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

C++ cin 清理缓冲区

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


请注意,本文编写于 1326 天前,最后修改于 578 天前,其中某些信息可能已经过时。

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://idealclover.top/archives/338/

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

标签: 输入


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK