这是我的问题:
我编写了一个函数来检测字符串是否基于“0x####”格式的十六进制:
int lc3_hashex(char *str)
{
int val = 0;
char *to;
to = strndup(str+2, 10);
val = sscanf(to, "%x", &val);
if (val)
{
return val;
}
return 0;
}
假设参数的形式为“0x####”,它返回帖子“0x”数字的十进制版本。但是是否有任何内置方式(或我刚刚监督的方式)来获取十六进制数“0x4000”的整数值而不是“4000”的整数值?
谢谢。
最佳答案
您可以将该函数简化为:
int cnt = sscanf(str, "%x", &val);
if (cnt == 1) {
// read a valid `0xNNNN` string
}
具有 %x
格式的 scanf
已经进行了十六进制转换,并且可以很好地处理 0x
前缀。此外,它的返回值是匹配项的数量,因此您可以使用它来确定它是否确实在 str
中找到了一个十六进制值。
有了它,您就拥有了所需的两条信息:字符串的格式是否符合您的预期,以及它的值是多少(正确转换)。它还避免了字符串分配(您没有释放),以及如果 strlen(str)
小于两个则您的代码存在的错误。
如果您将函数签名更改为:
int check_and_get_hex(const char *str, int *val);
(或类似的东西),相应地更新 sscanf
调用(传递 val
而不是 &val
),然后返回 ( cnt == 1)
,您可以一次获得“它是一个有效的十六进制字符串”和调用者的值。
关于c - 从 "0x4000"(例如)字符串获取十六进制值并将其存储在变量中。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6869093/