十六进制数比较?
Hexadecimal number comparison?
我是 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;
}
if (rgba > 0xFFFFFFFF)
rgba
是一个 32 位无符号整数值,上面的条件总是假的。 32 位无符号整数值始终 <= 0xFFFFFFFF。
您可以先将用户输入存储到 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);
检查 scanf
的 return 值:它 returns 1 当且仅当输入是有效的十六进制数且没有溢出。请注意,只有当 int
在您的平台上恰好是 32 位时,这才适合您的目的。
正如 @Jongware 评论的那样,"You cannot check for a number larger than it is possible to store."
要检测用户输入是否超出 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);
方法二:使用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
。
我是 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;
}
if (rgba > 0xFFFFFFFF)
rgba
是一个 32 位无符号整数值,上面的条件总是假的。 32 位无符号整数值始终 <= 0xFFFFFFFF。
您可以先将用户输入存储到 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);
检查 scanf
的 return 值:它 returns 1 当且仅当输入是有效的十六进制数且没有溢出。请注意,只有当 int
在您的平台上恰好是 32 位时,这才适合您的目的。
正如 @Jongware 评论的那样,"You cannot check for a number larger than it is possible to store."
要检测用户输入是否超出 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);
方法二:使用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
。