gpt4 book ai didi

c - 使用 sscanf 读取十六进制值失败

转载 作者:行者123 更新时间:2023-12-05 01:32:17 25 4
gpt4 key购买 nike

这是我的代码的更短版本:

char token[256];
unsigned int maskval = 0;

//Token gets read in here.

printf("token: %s\n", token);

if (sscanf(token + 2, "%x", &maskval) == 1) {
//do stuff
} else {
printf("error: %d, %x\n", maskval, maskval);
}

如您所见,我将十六进制字符串传递给函数,将它们读入 token 并使用 sscanf() 将十六进制值的字符串版本转换为无符号整数。字符串标记始终以“0x”、“0X”、“Ox”或“OX”开头。这样做的原因是因为用户在输入值时将无法分辨 0 或 O 之间的区别(vi 显示它们相同,图形)。如果我通过它“0x00EE”,我得到的结果是:
token: 0x00EE
error: 0

我认为的问题是我是否按照“0x00EE”或“OxOOEE”(零与大写 o)的方式传递了一些东西。两者在 vi 中看起来相同,我不确定在这种情况下它们的处理方式是否不同。希望我只是在做一些我忽略的非常简单和愚蠢的事情(通常情况如此)。另外,我试过使用
maskval = strtol(token, NULL, 16);

而不是 sscanf() 但我得到了完全相同的结果。

有任何想法吗?

最佳答案

这是一个错误:

char *token[256];

这是一个由 256 个指向字符 ( char * ) 的指针组成的数组,而不是一个字符数组。

你的意思是:
char token[256];

应该有很多编译器警告。

对于 sscanf() 来说,尝试从以无效十六进制数字开头的字符串解析十六进制值当然会失败。和 strtoul() .您几乎听起来好像认为标准函数应该考虑 'O'是十六进制只是因为它看起来像你的数字 0。那是......不是它们的设计方式,我认为这是幸运的。 :) 您可能想考虑更改字体。

您可以手动去除不符合规定的前缀。假设你总是有 2 个字符的前缀,然后可能有一个,你可以这样做:
const char *number = token + 2;

while(!isxdigit(*number))
number++;
/* Now number will point at the first hexadecimal
digit in token, or '\0' if none were found.
*/
if(sscanf(number, "%x", &maskval) == 1)
printf("success, got %x\n", maskval);
else
printf("failed to parse '%s' as hexadecimal number\n", number);

关于c - 使用 sscanf 读取十六进制值失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10210981/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com