char数组的%02x格式说明符

时间:2014-05-06 06:34:35

标签: c hex printf format-specifiers

我已经阅读了有关%02x格式说明符的内容,但是当涉及char数组类型的参数时,我无法理解以下代码段的输出:

int main() {
    // your code goes here
    char str[6] = "abcde";
    char t[3];

    snprintf(t,3,"%02x",str);
    printf("\t%s",t);
    return 0;
}

输出:

bf

如何在此格式说明符下解析str是一个值得关注的问题。我的感觉,输出应该是“ab”(没有引号)。

3 个答案:

答案 0 :(得分:1)

看看the CPlusPlus entry on printf. 我认为您要查找的格式说明符是%2.2s,它将打印的最小和最大字符数限制为2,并且它将打印一个字符串,而不是指针的值。

main(){
    printf("%2.2s","abcde");
    return 0;
}

这将打印" ab" (没有引号)。相同的格式规则适用于整个printf系列,包括snprintf。

%02x是一个格式说明符,它告诉解析器你的值是一个数字,你希望它打印在16中,你希望打印至少2个字符,并且它应用任何填充应该充满零,而不是空格。您需要使用某些版本的%s来打印字符串。

答案 1 :(得分:0)

您应该仔细阅读您的来源。他们可能会使用这样的东西:

int main() {
    char str[6] = "abcde";
    char t[2*6] = { 0 };
    int i;

    for (i = 0; i <= 5; ++i)
    {
        snprintf(t+2*i, sizeof(t)-2*(i), "%02x", str[i]);
    }
    printf("\t%s",t);
    return 0;
}

%02x用于将一个字符转换为十六进制字符串。因此,您需要访问str的各个字符。您可以在我的代码显示时构建一行,也可以在片段显示时输出每个转换后的字符串。但是,使用临时变量t没有意义。

编辑:固定代码。

答案 2 :(得分:0)

这里要点是,如果您使用%02x打印任何内容,那么您应该将其用于每个字节。在打印哈希摘要时,通常会声明一个大小为摘要大小两倍的字段(如果是字符串则为\ 0,则为+),然后使用重复的sprintf()调用填充它。

因此需要通过字节循环