Как справиться с посторонними символами, оставленными на входном потоке? (Кин пропустил) - PullRequest
0 голосов
/ 23 августа 2009

Извините за нубистский вопрос, но я только изучаю C ++ и ищу стандартный способ решения этой проблемы. Я использую VS2005.

Учитывая программу:

#include <iostream>

using namespace std;

int main( )
{
    while ( true )
    {       
        cout << "enter anything but an integer and watch me loop." << endl;     
        int i;
        cin >> i;               
    }
    return 0;
}

Если вы введете что-либо кроме целого числа, программа никогда не позволит вам снова вводить что-либо. Теперь я понимаю, что это потому, что после сбоя формата в потоке остается ввод, поэтому каждый вызов cin << i просто читает до следующей конечной строки (думаю) Как вы, ребята, очищаете поток или решаете эту проблему? Это должно быть довольно распространенным явлением. </p>

Ответы [ 3 ]

2 голосов
/ 23 августа 2009

окружите cin-вызов символом if.

Cin вернет false, если прочитаны неправильные данные.

так:

if (!cin >> i) {
  cin.clear();
  cin.ignore(INT_MAX, '\n');
  cout << "Haha, your looping efforts have been thwarted dear sir\n";
}

cin.flush () должен сделать свое дело (согласно cppreference.com), но не на VS, очевидно.

cin.clear () сбрасывает все флаги в хорошее состояние. cin.ignore с большим числом и до тех пор, пока '\ n' не будет работать.

2 голосов
/ 23 августа 2009

Хорошо, я нашел ответ. Ответ ...

Не делай этого. Не смешивайте форматированный и неформатированный ввод, используя оператор >>. Вот хорошая статья на эту тему:

http://www.cplusplus.com/forum/articles/6046/

В основном код изменяется на:

#include <iostream>
#include <string>
#include <stream>

using namespace std;

int main( )
{
    while ( true )
    {           
        cout << "enter anything but an integer and watch me loop." << endl;     
        string input;
        getline( cin, input );
        int i;
        stringstream stream( input );
        if ( stream >> i ) break;                       
    }
    return 0;
}
0 голосов
/ 23 августа 2009

cin.ignore (int num_bytes_to_ignore); сделаю это.

Вы также можете использовать stdio, fflush (fd); где fd это одно из следующих значений: стандартный вывод, стандартный вывод, стандартный вывод.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...