我使用sprintf
和strcat
时遇到问题。这是我的代码:
unsigned char hashResults[8][16];
unsigned char tmp[2];
unsigned char hash[8][32];
transformation("toto", 4, hashResults);
for (int k = 0; k < 8; ++k)
{
for (int i = 0; i < 16; ++i)
{
sprintf(tmp,"%2.2x",hashResults[k][i]);
strcat(hash[k],tmp);
}
printf("%d \n%s\n", strlen(hash[k]), hash[k]);
}
printf("Test : %s\n", hash[3]);
函数transformation()
在16位上给出了8个哈希值。
我使用sprintf
和strcat
来获取32位的哈希值。当我尝试读取所有hash[k]
时,strlen(hash[8])
返回给我32(这是正确的),字符串也是正确的。
但是,当我尝试在循环外部读取hash[3]
时,它包含所有值。
例如,我程序的输出:
32 - 4a18e332afba75b9734e875323f452f8
32 - b96833277faf31a5915c769f44634506
32 - f89f6dd8cd5aee79de3b2c0c27cafe2e
32 - c9f629472c862c1e7542f4cb2835d02b
32 - 09fc12cfb0a81a38513dbd5edff19e52
32 - 35564354793555a3ae1382f647044445
Test : b96833277faf31a5915c769f44634506f89f6dd8cd5aee79de3b2c0c27cafe2ec9f629472c862c1e7542f4cb2835d02b09fc12cfb0a81a38513dbd5edff19e5235564354793555a3ae1382f647044445
有没有人看到这个问题?我希望使用这些哈希来将它们与其他哈希值进行比较。
答案 0 :(得分:1)
您应该将unsigned char tmp[2]
增加到unsigned char tmp[3]
,将unsigned char hash[8][32]
增加到unsigned char hash[8][33];
一个问题是sprintf(tmp,"%2.2x",hashResults[k][i])
,因为它写了两个字符+'\ 0',它在数组tmp
中包含三个元素。
但最大的问题是strcat(hash[k],tmp);
。
在每个内部for循环结束时,你已经在hash [k]数组中写入了33个字符(32个字符+'\ 0')。当您在内部for循环中填充其中一个hash[k]
数组时,您还会将\0'
写入下一个数组中的第一个元素,这就是printf("%d \n%s\n", strlen(hash[k]), hash[k]);
打印正确结果的原因。这误导你相信你已经终止了hash[k]
数组。现在,当您进入下一个内部for循环时,您将覆盖上次退出内部for循环时已写入此数组的null,不再终止前一个数组。
因此,通过将零写入内部for循环退出处的hash[k]
数组的第一个元素,null终止hash[k+1]
数组。然后每次进入内部for循环时都覆盖此空值。
最后,你的数组中没有终止空值,只有最后一个数组的最后一个空值。
我想知道你是怎么每次都让它工作的,因为你写的超出数组大小的终止空值会导致未定义的行为。
制作tmp[3]
和hash[8][33]
可以解决您的问题。
为了使strcat()函数正常工作,你必须在要连接的数组中至少有一个null,否则它将不知道连接到哪里。你必须添加hash [k] [0] = 0;在进入每个内循环之前:
for (int k = 0; k < 8; ++k)
{
hash[k][0] = 0;
for (int i = 0; i < 16; ++i)
{
sprintf(tmp,"%2.2x",hashResults[k][i]);
strcat(hash[k],tmp);
}
printf("%d \n%s\n", strlen(hash[k]), hash[k]);
}