Ответ 1
Вот что происходит с входным буфером при запуске вашей программы:
std::cin >> name;
Вы ждете ввода. Когда вы вводите "Ryan Cleary" и нажимаете enter, буфер ввода содержит:
Ryan Cleary\n
Теперь ваш cin
читает ввод как обычно, останавливаясь в пробеле, оставляя ваш буфер следующим образом:
Cleary\n
Обратите внимание на начальное пространство, так как оно останавливается после прочтения Ryan
. Ваша первая переменная теперь содержит Ryan
. Если, однако, вы хотите получить полное имя, используйте std::getline
. Он будет читать до новой строки, а не только пробелов. В любом случае, продолжая:
std::cin >> age;
Теперь вы получаете еще один вход. Однако там что-то есть. Он пропускает пробелы, пока не начнет чтение, оставив буфер только:
\n
Вторая переменная получает текст Cleary
. Обратите внимание на новую строку в буфере, которая возвращает меня ко второй части. Замена system ("pause");
таким образом, который всегда работает, сложна. Лучше всего, как правило, жить с решением, отличным от совершенства, или, как мне нравится, тем, что не гарантируется, что он точно говорит:
std::cin.get(); //this consumes the left over newline and exits without waiting
Хорошо, поэтому cin.get()
не работает. Как насчет этого:
std::cin.get(); //consume left over newline
std::cin.get(); //wait
Это работает отлично, но что, если вы скопируете-вставьте его где-нибудь, где новая строка не останется? Вам нужно дважды нажать Enter!
Решение состоит в том, чтобы очистить новую строку (и все остальное), а затем подождать. Это цель cin.sync()
. Однако, как видно из раздела примечаний, не гарантируется очистка буфера, как он говорит, поэтому, если ваш компилятор не захочет, его нельзя использовать. Для меня, тем не менее, он делает именно это, оставляя решение:
std::cin.sync(); //clear buffer
std::cin.get(); //wait
Самое плохое в system("pause");
заключается в том, что вы понятия не имеете, какую программу он будет запускать на другом компьютере. Они могли бы изменить pause.exe
или поместить тот, который был найден первым, и вы не знаете. Это может потенциально разрушить их компьютер из-за того, что это возможно любая программа.