我是C语言的新手,对十六进制和十进制数字的工作方式有点困惑。我试着用最多4个字节,所以0xFFFFFFF。我基本上希望程序在输入9位或更高的数字时发出警报。我已经编写了如下代码,但它仍然允许我输入大于0xffffff的数字。我做错什么了?提前谢谢!

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”作为太大的输入,但对于大于“ffffffffffff”的数字会有问题。

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()。以下内容适用于长达99char的输入(包括'\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);

其他方法包括计算十六进制字符数或一次转换用户输入1char

09-10 04:26
查看更多