猿问

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

谷歌代码大学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()?

墨色风雨
浏览 817回答 3
3回答

catspeake

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

Cats萌萌

输入if&nbsp;(!(cin&nbsp;>>&nbsp;input_var))语句,如果在从CIN获取输入时发生错误。如果发生错误,则设置错误标志,以后获取输入的尝试将失败。所以你需要cin.clear();以消除错误标志。而且,失败的输入将位于我假设的某种缓冲区中。当您再次尝试获取输入时,它将在缓冲区中读取相同的输入,然后再次失败。所以你需要cin.ignore(10000,'\n');它从缓冲区中取出10000个字符,但如果遇到换行符(\n),则停止。10000只是一个普通的大值。
随时随地看视频慕课网APP
我要回答