从“0x4000”(例如)字符串获取十六进制值并将其存储在变量中。

时间:2011-07-29 05:41:00

标签: c type-conversion

这是我的问题:

我编写了一个函数,用于根据“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”?

感谢。

3 个答案:

答案 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”没问题。