2013-08-28 2 views
0

Я пишу простую программу, которая просит пользователя ввести букву. И тогда я хочу, чтобы он ввел фразу. Когда это всего лишь одна строка, у меня нет проблем.Попросить пользователя ввести символ, а затем строку

char c; 
string s; 
cin >> c; 
cin >> s; 

Но когда я хочу фразу

cin >> c; 
getline(cin, s); 

Когда я запускаю программу после того, как пользователь вводит букву и хиты войти я не получаю шанс ввести фразу. Конечно, если я набираю символ и вводим фразу после пробела, программа работает нормально.

Наоборот, когда я вводил символ, а затем вводил одну строку после пробела, используя первый метод, он не записывает строку.

Зачем это происходит?

+3

Используйте 'cin.ignore()' ... или просто перестаньте смешивать '>>' и 'getline'. Используйте один из двух, но не оба. –

ответ

3

Когда вы пишете символ и нажимаете ввод, на самом деле 2 символа посылают в буфер: сам символ и \n в результате нажатия клавиши ввода. Ваш cin >> c; читает первый символ только тогда, когда \n все еще остается в буфере. Так как std::getline() читает все, прежде чем он встречает символ \n, а так как \n - это первый символ, с которым он сталкивается, ничего не читает, и программа завершается. Добавьте std::cin.ignore(); (чтобы игнорировать \n) до std::getline, и код будет работать.

+0

Как это понятие отличается для случая ввода строки, используя только cin вместо getline()? Когда я просто использую cin >> s; после cin >> c; кажется, все работает отлично. – Ares

+1

'std :: cin()' находит первый символ не-новой строки и не-пробельный символ и читает до тех пор, пока не встретит его. Поэтому '\ n' пропускается. –

0

Поскольку c принимает только символ, клавиша ввода, которую пользователь нажимает, присваивается s, поэтому ничего, кроме этого, не записывается. Нажмите только одну клавишу и не вводите символ. Или просто используйте строку в любом случае.

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