Проблема здесь в том, что стандартный ввод (std::cin
) буферизован.Таким образом, программа не получает никакого ввода, пока не будет нажата клавиша <return>
(или вы не заполните буфер).Это создает впечатление, что код всегда будет ждать ввода пользователя.
Это не так.Он будет только ждать ввода пользователя, если текущий буфер пуст.Если в буфере есть данные, он будет читать их, а не ждать ввода пользователя.
Первое чтение:
cin.get(ch1);
Запуск программы, поэтому буфер пуст.Поэтому, когда вы читаете из std::cin
, программа приостанавливает ожидание сброса буфера, после чего символы будут прочитаны.Если вы нажмете A<return>
, ваш буфер заполнится двумя символами в буфере.
Buffer: 'A' '\n'
Теперь ваше чтение будет извлекать первый символ из ввода: 'A'
, оставляя '\n'
во входном потоке:
Buffer: '\n'
Теперь при втором чтении буфер не пуст.
cin.get(ch2);
И не нужно ждать, он прочитает следующий символ из потока.Таким образом, он читает символ '\n'
из потока.и продолжается.
Решения:
Это зависит от того, что вы хотите.Вы хотите только первый символ из строки?
std::cin.ignore(); // drops the rest of the line.
// The next character that will be available will
// be the first character of the next line.
Вы просто хотите игнорировать пробел?(это пробел / табуляция / перевод строки и т. д.).
std::cin >> v1 >> v2;
Использование operator>>
игнорирует начальный пробел, а затем считывает следующее значение.Поэтому он будет игнорировать новые строки (это пробелы).