C - Считать шестнадцатеричное число и проверить, меньше ли нуля scanf () - PullRequest
0 голосов
/ 12 марта 2019

Я пишу программу на C, которая читает шестнадцатеричное число с scanf(), и я хочу проверить, является ли значение допустимым. Но если я напишу -5, это показывает, что ввод действителен Есть ли какой-нибудь простой способ проверить, меньше ли входное значение, чем ноль, или мне нужно прочитать его как подписанное и затем изменить его?

unsigned int number;
scanf("%x",&number);
if (....) {
    printf("Invalid input!\n");
}

1 Ответ

0 голосов
/ 12 марта 2019

Есть ли какой-нибудь простой способ проверить, если вход меньше нуля

"%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().

...