2015-11-30 4 views
0

Я пытаюсь ввести строку, а затем целое число, а затем строку снова, но когда последний cin получает строку, и я нажимаю кнопку ввода, он сбой или выдается случайным образом на бесконечность. что не так?C++ getline не получает вход

int main(){ 
    string a= "", b = ""; 
    int n1 = 0, n2 = 0; 

    getline(cin, a); 
    cin >> n1; 

    //when i input the next like it outputs randomly without continuing with the next like why? 
    getline(cin, b); 

    //it doesn't let me to input here coz it's outputting some random strings. 
    cin >> n2; 
    return 0; 
} 

Я ценю за вашу помощь, спасибо.

+0

'он выходит из строя или выходы randomly' У меня есть ощущение, вы не показываете код, который используете, потому что код выше не должен вылетать или даже выводиться. В любом случае 'getline (cin, b);' не делает то, что, по вашему мнению, делает, у вас, вероятно, есть новая строка в вашем буфере слева от 'cin >> n1;', поэтому 'getline (cin, b); 'читает эту новую строку, а затем' cin >> n2; 'пытается прочитать все, что вы ожидали, чтобы читать в' b' и, по-видимому, терпит неудачу. – user657267

+2

Не смешивайте 'getline' с вводом типа' cin >> '. Он никогда не работает так, как вы ожидаете. –

+0

его фактически не сбой, а вывод случайного текста. – kobbycoder

ответ

1

Вам необходимо использовать символ новой строки.

int main(){ 
    string a, b; 
    int n1, n2; 

    getline(cin, a); 

    cin >> n1; 
    cin.get(); // this will consume the newline 
    getline(cin, b); 

    cin >> n2; 
    cin.get(); // this will consume the newline 
} 

std::getline будет использовать новую строку для вас.

Вот пример использования:

21:42 $ cat test.cc 
#include <iostream> 
#include <string> 

using namespace std; 

int main(){ 
    string a, b; 
    int n1, n2; 

    getline(cin, a); 

    cin >> n1; 
    cin.get(); // this will consume the newline 
    getline(cin, b); 

    cin >> n2; 
    cin.get(); // this will consume the newline 

    std::cout << a << " " << b << " " << n1 << n2 << std::endl; 
} 
✔ ~ 
21:42 $ g++ test.cc 
✔ ~ 
21:42 $ ./a.out 
hello 
4 
world 
2 
hello world 42 
+0

спасибо, пока я не использовал C++, и я забыл cin.get(). Спасибо, брат. – kobbycoder

+0

хорошо, спасибо – kobbycoder

+0

'get' может быть проблематичным ... он читает ровно один символ, поэтому, если после номера есть какое-то завершающее пробел, вы не будете потреблять« новую линию », как предполагалось. Предложение Уолта использовать «игнорировать» является более надежным, хотя и игнорирование опасностей ввода тоже: использование «skipws», тогда проверка следующего символа - это новая строка, более надежная. Код OP не выполняет никаких проверок ошибок, поэтому уровень теста низкий. –

1

В вашем случае после того, как ваш cin вы должны использовать cin.ignore(), а не cin.get() вроде этого:

cin.ignore(numeric_limits<streamsize>::max(), '\n');

+0

Я использовал игнорирование до того, как он пропустил третий cin – kobbycoder

 Смежные вопросы

  • Нет связанных вопросов^_^