十六进制数比较?

时间:2015-02-22 17:35:18

标签: c hex

我是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;
}

4 个答案:

答案 0 :(得分:2)

正如@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

答案 1 :(得分:0)

if (rgba > 0xFFFFFFFF)

rgba是32位无符号整数值,上述条件始终为false。 32位无符号整数值始终为< = 0xFFFFFFFF。

答案 2 :(得分:0)

您可以做的是先将用户输入存储到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 :(得分:0)

检查scanf的返回值:当且仅当输入是有效的十六进制数而没有溢出时,它返回1。请注意,如果int在您的平台上只有32位,这只适合您的目的。