C,sprintf和string和int的"sum"

Seg*_*las 0 c printf

我很多时候没有使用过C,现在我必须修改一小段代码.有一点我无法理解:

char filename[20];
filename[0] = '\0';
for (j=0; j < SHA_DIGEST_LENGTH; j++){
  sprintf(filename + strlen(filename),"%02x",result[j]);
}
Run Code Online (Sandbox Code Playgroud)

在第一行中,一个20个字符的字符串被dleclared.在第二行中,第一个字符设置为'\ 0',我想是一个空字符串.

在for循环中我不明白文件名和它的长度之间的"总和"...... sprintf的第一个参数应该是一个缓冲区,在那里复制右边的格式化字符串.这笔款项的结果是什么?在我看来,我正在尝试将数组和整数相加...

我错过了什么?

Mat*_*hen 13

它是指针算术. strlen返回NUL终止符之前的字符数.添加的结果将指向此终结符.例如,如果当前字符串是"AA"(后跟NUL),则strlen为2. filename + 2指向NUL.它将在NUL和下一个字符上写下一个十六进制字符(例如BB).然后NUL再次终止它(at filename + 4).那么你将拥有"AABB"(然后是NUL).

但它确实没有意义.它浪费了很多时间寻找那些NUL.具体来说,它是一个二次算法.第一次,它检查1个字符,然后3,5,7,...,2*SHA_DIGEST_LENGTH - 1)那个.它可能只是:

sprintf(filename + 2 * j,"%02x",result[j]);
Run Code Online (Sandbox Code Playgroud)

还有另一个问题.SHA-1和的十六进制表示需要40个字符,因为一个字节需要两个字符.然后,你有一个最终的NUL终结符,所以应该有41.否则,有一个缓冲区溢出.