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

标签 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”的整数值?

谢谢。

最佳答案

您可以将该函数简化为:

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/

相关文章:

android - 将字符串数组从 SQLite 转换为整数数组

Python:为什么 __str__ 不调用递归?

c# - 我需要将 XML 字符串转换为 XmlElement

oracle - sqlplus到csv科学数转换

c - 参数在 gdb 中的哪里以及 ret 在哪里?

c - Yoda 条件和整数提升

c - 警告 : Implicit declaration error

c - 为什么 realloc 在这种情况下不能正常工作?

c++ - 将 char 类型转换为 int 以用作 vector C++ 的索引

c - 我以为存在内存入侵问题,是吗?