我在使用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%sn", strlen(hash[k]), hash[k]);
}
printf("Test : %sn", 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
有人看到问题了吗?我希望使用这些哈希将它们与其他哈希进行比较。
您应该将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]
数组之一时,您还将