cin.clear() doesn't reset cin object

后端 未结 1 1056
别跟我提以往
别跟我提以往 2020-12-06 11:48

I have the following loop. It should read numbers until EndOfFile, or the user input -999

int arr[100];

int index;

for (index = 0; index <          


        
相关标签:
1条回答
  • 2020-12-06 12:39

    After calling clear, you must also somehow remove the invalid input from the stream. Here is one way:

     cin >> arr[index];
     if (!cin)
     {
      cin.clear();
      std::string ignoreLine; //read the invalid input into it
      std::getline(cin, ignoreLine); //read the line till next space
      index--;
      continue;
     }
    

    It's because when cin fails to read the invalid input, it remains there in the stream. It has to be removed, by some means. I just read and ignore it.

    You can also use ignore as:

    cin.clear();
    cin.ignore(std::numeric_limits<streamsize>::max(),' ');
    

    which is better in my opinion provided inputs are space separated (and if you don't want to inspect the invalid input). The online doc says:

    istream::ignore

    istream& ignore( streamsize n = 1, int delim = EOF );

    Extract and discard characters

    Extracts characters from the input sequence and discards them.

    The extraction ends when n characters have been extracted and discarded or when the character delim is found, whichever comes first. In the latter case, the delim character itself is also extracted.

    0 讨论(0)
提交回复
热议问题