Как уже указывалось, проблема в том, что в вашем входном буфере была строка для числа И символа новой строки. C ++ I / O пропускает начальные пробелы, когда читает что-то вроде числа, но не удаляет конечные пробелы из буфера. Это оставляет это для чтения next , чтобы иметь дело с. Так что getchar()
получает новую строку, которая еще не завершена.
Игнорируйте советы от людей, которые пытаются сказать вам flush (), ignore () или очистить «все, что было в буфере до вызова getchar()
». Эти функции не имеют понятия «неблокирующий» ввод.
Сказал по-другому: обычные функции потока ввода C ++ не имеют понятия "сейчас там ничего нет" ... но потом вы звоните позже и он говорит "о но сейчас есть что-то !!! " Есть" входная последовательность ", которую вы можете обнаружить как остановку только при нажатии EOF.
Исключением из этого является readsome () ..., которое вместо работы с «входной последовательностью» работает с «входным буфером». Найдя такую вещь, мы могли бы попробовать это:
#include<iostream>
#include<cstdio>//to pause console screen
using namespace std;
int main(int argc, char* argv[]) {
cout << "Enter a number\n";
int num;
cin >> num;
char ch;
while (cin.readsome(&ch, 1) != 0)
;
cout << "Press any key to continue...\n";
getchar();
return 0;
}
Но, по крайней мере, на моей машине это не приводит к желаемому эффекту. Это означает, что хотя в терминальном приложении или конвейере ОС где-то есть новая строка, она еще не достигла объекта буфера внутреннего потока для cin
. Поднятие: есть неблокирующая функция ввода, основанная на буфере, но в этом сценарии это, очевидно, не поможет.
Ответ real - это то, что Альф сказал в комментарии. У большинства приличных сред разработки или настроек есть способ настроить его так, чтобы консоль не закрывалась автоматически. Если нет, взломайте его с помощью метода запуска. Черт возьми, вы даже можете поставить точку останова на return 0
в основном!
Примечания:
Вы должны знать, что «правильные» включения C ++ библиотек совместимости для C выполняются как #include <cfoo>
вместо #include "foo.h"
. Это может не иметь большого значения на практике ... но, как минимум, это отвлекает от вашего вопроса, когда люди комментируют его (как я делаю сейчас):
Является ли плохой практикой использование заголовка C вместо его эквивалента C ++ в C ++ (например, stdio.h вместо cstdio)?
Кроме того, вы могли бы продемонстрировать это с помощью гораздо меньшего сэмпла! Вы могли бы показать эффект просто с помощью:
#include<iostream>
#include<cstdio>//to pause console screen
using namespace std;
int main(int argc, char* argv[]) {
cout << "Enter a number\n";
int num;
cin >> num;
cout << "Press any key to continue...\n";
getchar();
return 0;
}
Так что постарайтесь урезать свои примеры, чтобы действительно изолировать проблему в будущем! (Не стесняйтесь редактировать свой вопрос, чтобы он был таким кратким, чтобы сделать эту тему более полезной для людей, которые ищут.)