2016-01-13 4 views
1
#include <iostream> 
using namespace std; 

int a, b, c, d; 

void main() 
{ 
    cout << "Reading a" << endl; 
    cin.ignore(); 
// cin.clear(); 
    cin >> a; 

    cout << "Reading b" << endl; 
    cin.ignore(); 
// cin.clear(); 
    cin >> b; 

    cout << "Reading c" << endl; 
    cin.ignore(); 
// cin.clear(); 
    cin >> c; 

    cout << a << " " << b << " " << c << endl; 
    system("pause"); 
} 

Я прочитал 3 раза переменные от a до c. Он работает, когда прекращается, когда я вводим случайное число, а затем принимаю его без пробелов (23, 45, 66). Однако, когда мой ввод выглядит так: 23 45 66 (промежутки между промежутками), он немедленно ставит 23 на a, 45 на b и 66 на c.Правильный способ сброса ввода cin

Мое намерение состоит в том, чтобы читать число, заканчивать пробел, затем забыть остальную часть ввода и снова прочитать следующую переменную.

cin.ignore() и cin.clear(), похоже, не помогают мне, но, вероятно, я использую их неправильно.

Я мог бы сделать свой собственный буфер, а затем проверить его на пробелы, но прежде чем делать это, я хочу посмотреть, есть ли другой способ.

+3

Читать всю строку с GetLine затем выполнить строку в целое преобразование с помощью стои – mikedu95

+0

прекрасно работает и это очень быстро реализовать. Спасибо. –

ответ

4

Ответил mikedu95 в комментарии:

Читать всю линию с getline, а затем выполнить строку в целое преобразование с использованием stoi

#include <string> 
#include <iostream> 
using namespace std; 

string str; 
int a, b, c, d; 

void main() 
{ 
    cout << "Reading a" << endl; 
    getline(cin, str); 
    a = stoi(str); 

    cout << "Reading b" << endl; 
    getline(cin, str); 
    b = stoi(str); 

    cout << "Reading c" << endl; 
    getline(cin, str); 
    c = stoi(str); 

    cout << a << " " << b << " " << c << endl; 
    system("pause"); 
} 
3

Вы можете найти ответ на свой вопрос здесь: How does cin.clear() clear the input buffer?

Приведем здесь часть ответа с этой страницы:

Если вам нужно удалить символ из входного буфера, вам нужно будет сделать это явно. Например, вы можете использовать

  • stream.ignore(); безоговорочно удалить следующий символ (если таковой имеется, если нет никого, поток получит std::ios_base::eofbit набор).
  • stream.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); удалить все символы до и включая первый встречный символ '\n'.
  • вы можете ignore() символов, а stream.peek() дает класс символов вам не нравится (например, в то время как isdigit(stream.peek()) дает false)
Смежные вопросы