Если вы введете «только символ», он не «автоматически преобразует его в целое число». Он не принимает вообще никакого ввода , как показывает scanf, возвращая 0
, но эта ситуация ускользает от вашего теста.
Но ответ на ваш вопрос: с трудом при использовании scanf
.
Вот способ сделать это, получив ввод с помощью fgets
. Он будет допускать любое количество пробелов до или после числа, но не любые буквы.
Причина пробела перед %c
состоит в том, чтобы дать ему команду отфильтровать любой начальный пробел. В любом случае это автоматически для %d
, но не для %c
. Тогда, если нет читаемых символов, ничего не будет прочитано в extra
. Если есть хотя бы один символ (кроме пробелов), то счетчик конверсии sscanf
будет неправильным.
#include <stdio.h>
#include <stdbool.h>
int main(void)
{
int number_of_numbers = 0;
while(number_of_numbers >= 0) {
bool success = false;
char str[100];
if(fgets(str, sizeof str, stdin) != NULL) {
char extra;
if(sscanf(str, "%d %c", &number_of_numbers, &extra) == 1) {
success = true;
}
}
if(success) {
printf("Success: %d\n\n", number_of_numbers);
} else {
printf("Invalid size\n\n");
}
}
return 0;
}
Сеанс программы:
123
Success: 123
123a
Invalid size
123 a
Invalid size
123 9
Invalid size
a
Invalid size
-1
Success: -1
Причины использования fgets
are
он не "глохнет", если есть неверный ввод: он уже прочитан.
, если есть ошибка, строка может быть легко выгружена, а другая может быть запрошена.