Вы должны использовать что-то вроде:
#include <stdio.h>
int main(void)
{
int a;
int n = scanf("%d", &a);
if (n != 1)
{
fprintf(stderr, "Failed to read an integer (%d)\n", n);
return 1;
}
printf("%d\n", a);
return 0;
}
Переменная n
позволяет вам различать guish между EOF (обычно -1
) и "первые данные после пробела не является частью целого числа "(n
будет содержать 0
). Обратите внимание, что сообщение об ошибке печатается при стандартной ошибке; вот для чего это нужно. Обычно вы должны печатать новую строку в конце выходных сообщений.
Вы можете решить не использовать n
, а затем не печатать его в сообщении об ошибке:
#include <stdio.h>
int main(void)
{
int a;
if (scanf("%d", &a) != 1)
{
fprintf(stderr, "Failed to read an integer\n");
return 1;
}
printf("%d\n", a);
return 0;
}
Это все еще важно проверить результат от scanf()
, чтобы, если пользователь набрал zero
вместо 0
, вы могли определить проблему.
Обратите внимание, что a
не будет назначен, если сопоставление не удается - поэтому без теста вы бы распечатали неинициализированную переменную, что не является хорошей идеей. Вы можете определить int a = 0;
, чтобы избежать этой проблемы (с любым выбором инициализатора int
, который вам нравится).