首页 > 解决方案 > C sscanf("%hhx") 读取一个 unsigned int 而不是 unsigned char

问题描述

我们使用 sscanf() 将十六进制值转换为字符串,如下所示:

#include <stdio.h>
#include <string>
int main() {
    char data[] = "41424344";
    unsigned int result = 0;
    sscanf(data, "%hhx", &result);
    printf("%x\n", result);
    result = 0;
    sscanf(data, "%2x", &result);
    printf("%x\n", result);
    result = 0;
    sscanf(data, "%2hhx", &result);
    printf("%x\n", result);
    return 0;
}

输出:

41424344
41
41

从第一个输出中,我们可以看到sscanf("%hhx")读取整个 4 个字节而不是 1 个字节(“unsigned char”)。为什么?

标签: cscanf

解决方案


由于格式说明符和参数类型不匹配而导致的未定义行为。

根据例如这个scanf参考hh前缀意味着参数需要是一个,这与你传递unsigned char *的完全不同。unsigned int *

%2hhx实际上,您的格式也有这个问题。


推荐阅读