我已经阅读了有关%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”(没有引号)。
答案 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()调用填充它。
因此需要通过字节循环。