Сравнение шестнадцатеричных чисел?

Вопрос: Я новичок в языке C и немного запутался в том, как работают шестнадцатеричные, десятичные числа. Я пытаюсь работать с максимум 4 байтами, поэтому 0xFFFFFFFF. В основном я хочу, чтобы программа выдавала предупреждение, если любое число вводится с 9 цифрами или выше. Я написал код, как показано ниже, но он все же позволяет вводить числа,

Вопрос:

Я новичок в языке C и немного запутался в том, как работают шестнадцатеричные, десятичные числа. Я пытаюсь работать с максимум 4 байтами, поэтому 0xFFFFFFFF. В основном я хочу, чтобы программа выдавала предупреждение, если любое число вводится с 9 цифрами или выше. Я написал код, как показано ниже, но он все же позволяет вводить числа, превышающие 0xFFFFFFFF. Что я делаю не так? Заранее спасибо!

int main() { uint32_t rgba; printf(«Enter rgba value: «); scanf(«%x», &rgba); if (rgba > 0xFFFFFFFF){ printf(«Maximum number of 8 digits!n»); } else{ rgba_values(rgba); } return 0; } Лучший ответ:

Как @Jongware прокомментировал: “Вы не можете проверить число, большее, чем можно сохранить”.

Чтобы определить, находится ли вход пользователя вне диапазона uint32_t rgba, код должен понимать, что пользовательский ввод имеет или будет превышать этот диапазон.

Метод 1: Используйте более крупный целочисленный тип: этот метод обнаруживает “100000000” как слишком большой вход, но будет иметь проблемы с номерами, большими, чем “FFFFFFFFFFFFFFFF”.

unsigned long long UserInput; uint32_t rgba; printf(«Enter rgba value: «); if (scanf(«%llx», &UserInput) != 1) { puts(«EOF or Scan Failure»); return 1; } if (UserInput > 0xFFFFFFFFu) { puts(«Range error»); return 1; } rgba = UserInput; rgba_values(rgba);

Способ 2. Используйте fgets()/strtoul(). Следующее будет работать для ввода длиной до 99 char (включая ‘n’).

uint32_t rgba; char *buf[100]; printf(«Enter rgba value: «); if(fgets(buf, sizeof buf, stdin) == NULL) { puts(«EOF»); return 1; } char *endptr = 0; errno = 0; unsigned long ul = strtoul(buf, &endptr, 16); if (buf == endptr) { puts(«No conversion»); return 1; } if (errno || ul > 0xFFFFFFFFu) { puts(«value out of range»); return 1; } rgba = (uint32_t) ul; rgba_values(rgba);

Другие методы включают подсчет числа шестнадцатеричных символов или одновременное преобразование пользовательского ввода 1 char.

Ответ №1if (rgba > 0xFFFFFFFF)

rgba – это 32-разрядное целое число без знака, условие выше всегда ложно. 32-разрядное целое значение без знака всегда <= 0xFFFFFFFF.

Ответ №2

Что вы можете сделать, так это сначала сохранить вход пользователя в char *:

char rgba_str[20]; // 20 is an arbitrary larger buffer size printf(«Enter rgba value: «); scanf(«%s», &rgba_str);

Затем проверьте и убедитесь, что длина строки больше 9 цифр:

if ( strlen( rgba_str ) > 8 ) // Error

Если нет, поверните rgba_str в шестнадцатеричное целое число:

else rgba = strtoul(rgba_str, NULL, 16); Ответ №3

Проверьте возвращаемое значение scanf: оно возвращает 1 тогда и только тогда, когда вход является допустимым шестнадцатеричным числом без переполнения. Обратите внимание, что это будет только соответствовать вашей цели, если int составляет ровно 32 бита на вашей платформе.

Оцените статью
Добавить комментарий