C、string和int的sprintf和 "sum"

标签 c printf

很久没用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/

相关文章:

c - 每次在c中输出不同?

c - 指向结构数组的指针 - 解释

c - 在 C 中使用 sprintf 进行十六进制到十进制的转换

c - 解释 sizeof 运算符应用于函数类型时的输出

c++ - Printf和Scanf C++实现

c - printf 不工作和其他问题

c - C 中的 "struct namespace"是否有技术原因?

java - 由于无法通过引用传递,组织 Java 代码的最佳方式是什么?

c - 当使用两个不同的地址调用时,inet_ntoa 给出相同的结果

使用 C 使用头文件中定义的结构时出现编译错误