这是我的问题:
我编写了一个函数,用于根据“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”?
感谢。
答案 0 :(得分:6)
您可以将该功能缩减为:
int cnt = sscanf(str, "%x", &val);
if (cnt == 1) {
// read a valid `0xNNNN` string
}
具有scanf
格式的 %x
已经进行十六进制转换,并且处理0x
前缀就好了。此外,它的返回值是匹配的项目数,因此您可以使用它来确定它是否确实在str
中找到了十六进制值。
通过这种方式,您可以获得所需的两条信息:字符串是否按照您的预期格式化,以及它的值(正确转换)。它还避免了字符串分配(你没有释放),以及strlen(str)
小于2时你的代码所带来的错误。
如果您将功能签名更改为:
int check_and_get_hex(const char *str, int *val);
(或类似内容),相应地更新sscanf
来电(通过val
而不是&val
),然后返回(cnt == 1)
,您可以同时获得“{1}}一个有效的十六进制字符串“和一次性调用者的值。
答案 1 :(得分:2)
使用stdlib.h
中的strtol并将基数指定为16.
唯一的缺点是此函数在失败时返回0,因此您需要检查以确保其输入不为0.
答案 2 :(得分:1)
我无法理解为什么在执行sscanf
之前字符串被缩短了。如果您希望将十六进制值中的字符串转换为十进制整数,则可以直接给它。
#include<stdio.h>
int main()
{
char sHex[7] = "0x2002";
int nVal = 0;
sscanf( sHex, "%x", &nVal );
printf( "%d", nVal );
return 0;
}
这将打印8194,0x2002的十进制值。通过将"%x"
赋予sscanf
,您将输入字符串指定为十六进制。所以,前面的“0x”没问题。