Есть много soutions:
feof предпочтителен один для проверки, если буфер пуст.
if (!feof(stdin)) // Check if the stdin is empty
// read stuff
poll или select с тайм-аут 0 - это будет немедленно вернуться и результат либо -1 с ERRNO EAGAIN
если данные отсутствуют или количество дескрипторов с данными (один, так как вы проверяете только STDIN).
ioctl - швейцарский армейский нож с дескрипторами. Запрос вам нужно I_NREAD
:
if (ioctl(0, I_NREAD, &n) == 0 && n > 0)
// we have exactly n bytes to read
Однако правильное решение, чтобы прочитать все, что вы получили (с помощью scanf
) в качестве линии, а затем обработать результат - и это работает достаточно хорошо с sscanf
:
char buf[80]; // large enough
scanf("%79s", buf); // read everything we have in stdin
if (sscanf(buf, "%d", &number) == 1)
// we have a number
... до тех пор, пока вы должным образом обрабатываете повторное чтение, строки, которые больше, чем ваш буфер, и другие реальные осложнения.
Try «Человек выберите» –
Проверка на EOF. (Это не символ, но будет возвращено значение, если поток пуст.) – UncleO