Основной ввод строки

Я только что наткнулся на фрагмент кода, который позволяет пользователям вводить строки в командной строке. Я знаю, что они делают, и это все здорово. Но у меня есть вопрос относительно функций cin и getline().

string name ;
cout << "Please enter your full name: " ;
cin >> name ;
cout << "Welcome " << name << endl ;
cout << "Please enter your full name again please: " ;
getline(cin , name) ;
cout << "That's better, thanks " << name << endl ;
return 0 ;

Теперь, когда это выводится, я получаю что-то вроде: (используя john smith в качестве ввода)

Please enter your full name: john smith
Welcome John
Please enter your full name again: That's better thanks Smith

Я понимаю, почему это происходит, getline все еще читает из входного буфера, и я знаю, как это исправить. Мой вопрос: почему после «Пожалуйста, введите свое полное имя еще раз:» нет новой строки? Когда я изменяю код на:

string name ;
cout << "Please enter your full name: " ;
cin >> name ;
cout << "Welcome " << name << endl ;
cout << "Please enter your full name again please: " ;
cin.ignore( 256, '\n') ;
getline(cin , name) ;
cout << "That's better, thanks " << name << endl ;
return 0 ;

Внезапно я получаю новую строку после того, как вы снова вводите свое полное имя. Честно говоря, это не очень большая проблема. Но я был бы не против узнать, что произошло, если бы кто-нибудь мог мне помочь. Спасибо!


person user2779581    schedule 14.09.2013    source источник


Ответы (1)


Видите ли, когда вы вводите «Джон Смит» в качестве ввода, сначала cin >> name будет читать не всю строку, а содержимое строки до первого пробела.

Итак, после первого cin переменная имени будет содержать John. В буфере все еще будет Smith\n, и вы решили это, используя:

cin.ignore( 256, '\n') ;

Примечание. Как предложил Конрад Рудольф, вам действительно не следует использовать в коде 256 или любые другие магические числа. Скорее используйте std::numeric_limits<std::streamsize>::max(). Вот что говорится в документах о первом аргументе istream::ignore:

Максимальное количество символов для извлечения (и игнорирования). Если это ровно numeric_limits<streamsize>::max(), ограничений нет: извлекается столько символов, сколько необходимо, пока не будет найден разделитель (или конец файла).

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

Мой вопрос: почему после «Пожалуйста, введите свое полное имя еще раз:» нет новой строки?

Потому что вы не выводите его на стандартный вывод, и у пользователя не было возможности нажать Enter. getline прочитает Smith\n из буфера и сразу же продолжит работу. Он не будет отображать символы новой строки на вашей консоли - getline этого не делает.

Внезапно я получаю новую строку после того, как вы снова вводите свое полное имя. Честно говоря, это не очень большая проблема. Но я был бы не против узнать, что произошло, если бы кто-нибудь мог мне помочь. Спасибо!

Это новая строка, которую пользователь вводит с помощью клавиши Enter, она исходит не от вашей программы.

Редактировать Нажатие Enter в терминале обычно (в зависимости от настроек терминала) выполняет несколько отдельных действий:

  1. Вставка \n во входной буфер
  2. Очистка входного буфера
  3. Сдвиг курсора ввода на одну строку вниз
  4. Перемещение курсора ввода в начало строки
person Nemanja Boric    schedule 14.09.2013
comment
Пожалуйста, не используйте магические числа в коде. Правильно здесь будет std::numeric_limits<std::streamsize>::max(). - person Konrad Rudolph; 14.09.2013
comment
Спасибо за совет относительно функции cin.ignore, я обязательно запишу это для дальнейшего использования. Так что было бы правильно сказать, что клавиша возврата делает две разные вещи при нажатии в командной строке, вводя /n как часть ввода и сдвигая поток ввода вниз на строку? (Я знаю, что эта терминология неверна, но это единственный способ, которым я могу ее передать.) В противном случае не будет ли «Smith/n», оставленный в буфере, действовать так, как если бы пользователь снова нажал клавишу «Return»? Извиняюсь за то, что этот комментарий вообще не отформатирован, я новичок в этом, но спасибо за ваши ответы! - person user2779581; 15.09.2013
comment
Большое спасибо! Я уверен, что это даже вряд ли можно считать реальной проблемой, но здорово, что вы нашли время, чтобы ответить на нее. Это очень ценно, спасибо. - person user2779581; 15.09.2013
comment
Хорошо, если кто-то все еще слушает, я попытался использовать решение std::numeric_limits<std::streamsize>::max() в моей функции cin.ignore, и в командной строке появляется целая куча вещей, говорящих, что это просто не сработает. Существуют ли определенные библиотеки, которые мне нужно объявить, чтобы использовать это? В настоящее время у меня есть только #include <string> #include <iostream> using namespace std ; Любая помощь будет принята с благодарностью, спасибо, ребята. - person user2779581; 16.09.2013
comment
@user2779581 #include <limits> - person Nemanja Boric; 16.09.2013
comment
Я знаю, что в разделе комментариев сказано не включать слова благодарности, но я чувствовал бы себя грубым, если бы не выразил благодарность, так что спасибо. - person user2779581; 16.09.2013
comment
@user2779581 user2779581 Или вы можете просто принять этот ответ, если он работает на вас :). Jk, пожалуйста! - person Nemanja Boric; 16.09.2013
comment
Упс, я не увидел кнопку ответа на вопрос :P Еще раз спасибо, ребята! - person user2779581; 16.09.2013