为了账号安全,请及时绑定邮箱和手机立即绑定

为什么我们要在读取输入后调用cin.CLEAR()和cin.IGNORE()?

为什么我们要在读取输入后调用cin.CLEAR()和cin.IGNORE()?

C++
墨色风雨 2019-06-16 13:39:45
谷歌代码大学C+教程以前有这样的代码:// Description: Illustrate the use of cin to get input// and how to recover from errors.#include <iostream>using namespace std;int main(){   int input_var = 0;   // Enter the do while loop and stay there until either   // a non-numeric is entered, or -1 is entered.  Note that   // cin will accept any integer, 4, 40, 400, etc.   do {     cout << "Enter a number (-1 = quit): ";     // The following line accepts input from the keyboard into     // variable input_var.     // cin returns false if an input operation fails, that is, if     // something other than an int (the type of input_var) is entered.     if (!(cin >> input_var)) {       cout << "Please enter numbers only." << endl;       cin.clear();       cin.ignore(10000,'\n');     }     if (input_var != -1) {       cout << "You entered " << input_var << endl;     }   }   while (input_var != -1);   cout << "All done." << endl;   return 0;}…的意义是什么?cin.clear()和cin.ignore()?为什么10000和\n必要的参数?为什么我们要在读取输入后调用cin.CLEAR()和cin.IGNORE()?
查看完整描述

3 回答

?
catspeake

TA贡献1111条经验 获得超0个赞

这个cin.clear()清除错误标志。cin(这样以后的I/O操作将正确工作),然后cin.ignore(10000, '\n')跳到下一个换行符(忽略与非数字相同的行上的任何其他内容,这样就不会导致另一个解析失败)。它只会跳过10000个字符,所以代码假设用户不会放一个非常长、无效的行。


查看完整回答
反对 回复 2019-06-16
?
Cats萌萌

TA贡献1805条经验 获得超9个赞

输入

if (!(cin >> input_var))

语句,如果在从CIN获取输入时发生错误。如果发生错误,则设置错误标志,以后获取输入的尝试将失败。所以你需要

cin.clear();

以消除错误标志。而且,失败的输入将位于我假设的某种缓冲区中。当您再次尝试获取输入时,它将在缓冲区中读取相同的输入,然后再次失败。所以你需要

cin.ignore(10000,'\n');

它从缓冲区中取出10000个字符,但如果遇到换行符(\n),则停止。10000只是一个普通的大值。


查看完整回答
反对 回复 2019-06-16
  • 3 回答
  • 0 关注
  • 816 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信