Вопрос:
Я новичок в языке 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 бита на вашей платформе.