这是我的代码的更短版本:
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);
}
正如您所看到的,我将十六进制字符串传递给函数,将它们读入令牌并使用sscanf()将十六进制值的字符串版本转换为unsigned int。字符串标记始终以“0x”,“0X”,“Ox”或“OX”开头。原因是因为用户在输入值时将无法区分0或O(vi显示相同的图形)。如果我将其传递给“0x00EE”,我得到的结果是:
token: 0x00EE
error: 0
我相信的问题是我是否通过了“0x00EE”或“OxOOEE”(零与资本o)的界限。两者在vi中看起来都相同,我不确定在这种情况下它们是否有不同的处理方式。希望我只做一些非常简单和愚蠢的事情,但我忽略了(通常情况就是如此)。另外,我尝试过使用
maskval = strtol(token, NULL, 16);
而不是sscanf(),但我得到完全相同的结果。
有什么想法吗?
答案 0 :(得分:5)
这是一个错误:
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);