Есть ли какой-нибудь простой способ проверить, если вход меньше нуля
"%x"
принимает ввод как "-123"
и формирует unsigned
положительное значение UINT_MAX + 1 - 123
. Так что одного этого недостаточно.
Либо поищите '-'
.
Ниже используется "%n"
, чтобы определить, было ли сканирование успешным после 1 или более '-'
(отсканировано с помощью "%*[-]"
). Если нет начального '-'
, ничего, кроме начальных пробелов, и n
остается 0.
int n = 0;
scanf(" %*[-]%n", &n);
if (n) {
printf("Invalid negative input!\n");
} else if (scanf("%x",&number) != 1) {
printf("Invalid non-hex input!\n");
} else {
printf("Success %x\n", number);
}
Непонятно, что OP хочет делать в случае неправильного ввода.
Лучший подход - использовать fgets()
, чтобы прочитать строку ввода пользователя и затем проанализировать ее.
char buf[80];
if (fgets(buf, sizeof buf, stdin) {
unsigned int number;
if (strchr(buf, '-') == NULL && sscanf(buf, "%x", &number) == 1) {
printf("Success %x\n", number);
} else {
printf("Fail\n");
}
}
Еще лучший код будет использовать strtoul()
, а не sscanf()
.