很久没用C了,现在要修改一小段代码。有一件事我不明白:
char filename[20];
filename[0] = '\0';
for (j=0; j < SHA_DIGEST_LENGTH; j++){
sprintf(filename + strlen(filename),"%02x",result[j]);
}
在第一行声明了一个 20 个字符的字符串。 在第二行中,第一个字符设置为“\0”,我想也是一个空字符串。
在 for 循环中,我不明白文件名与其长度之间的“总和”... sprintf 的第一个参数应该是一个缓冲区,用于复制右侧的格式化字符串。那个总和的结果是什么?在我看来,我正在尝试对一个数组和一个整数求和...
我错过了什么?
最佳答案
这是指针运算。 strlen
返回 NUL 终止符之前的字符数。添加的结果将指向该终止符。例如。如果当前字符串为“AA”(后跟一个 NUL),则 strlen 为 2。filename + 2
指向 NUL。它将在 NUL 和下一个字符上写入下一个十六进制字符(例如 BB)。然后它将再次以 NUL 终止它(在 filename + 4
处)。那么您将拥有“AABB”(然后是 NUL)。
虽然这并没有什么意义。寻找那些 NUL 会浪费很多时间。具体来说,它是一个二次算法。第一次,它检查 1 个字符,然后是 3, 5, 7, ..., 2 * SHA_DIGEST_LENGTH - 1) that .它可能只是:
sprintf(filename + 2 * j,"%02x",result[j]);
还有一个问题。 SHA-1 和的十六进制表示需要 40 个字符,因为一个字节需要两个字符。然后,你有一个最终的 NUL 终止符,所以应该有 41。否则,就会发生缓冲区溢出。
关于C、string和int的sprintf和 "sum",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3202456/