c - sprintf 会删除它上次写入缓冲区时添加的最后一个空字符吗?

标签 c printf

x = 2; n = 0;

for(i = 0; i < x; i++)
{
    if(A[i] > 1)
    {
        n += sprintf(buf + n, "%d ", A[i]);
    }
}

'2'[SPACE]'\0'
(deletes '\0' adds '3'[SPACE]'\0')
'2'[SPACE]'3'[SPACE]'\0'

这是循环过程中发生的事情吗? 谢谢。

最佳答案

您告诉它在第一个循环结束时从包含空字节的字符位置开始写入,因此作为一个行为良好、服从的函数,它就是这样做的。这样做消除了之前存在的空字节。

所以是的,sprintf()会覆盖它写入的最后一个空字符(因为你告诉它这样做)。

另一种看待它的方式是 sprintf()返回它写入的字符串的长度。在第一次迭代中,这相当于 strlen(buf) .存储在 buf + strlen(buf) 的值根据“字符串长度”的定义,是终止字符串的空字节。因此,在第二个循环中,您开始在字符串的末尾写入。返回值为您提供添加到 buf 的字符串的长度, 所以 n += <newlen>操作为您提供额外的字符串长度,确保循环安全进行。

理论上,sprintf()可能返回负值。我不认为这在这里很重要,但如果它确实发生了,你会遇到问题,因为计数器递减而不是递增 ( n )。此外,使用 snprintf() 可能更安全,但是你必须在每次迭代中调整可用长度,并担心缓冲区溢出(但无论如何你不得不担心这些,但是你通过首先分配足够或绰绰有余的空间来做到这一点)。

关于c - sprintf 会删除它上次写入缓冲区时添加的最后一个空字符吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20747695/

相关文章:

C - 嵌套 while 循环中的 Getchar 导致无限循环

c++ - 从 char 数组中截断和删除字符 C++

c - C 中的“类”行为

c - 多个 printf() 调用与一个长字符串的 printf() 调用?

我可以将所有函数参数(相同的数量、类型和顺序)转发给另一个函数吗

c - UDP客户端未收到消息

c++ - 以编程方式忽略 printf

c - Hook 类似 Printf 的函数并修改输出

c - 如何打印二进制文件的真实内容

c - printf ("%d %d %d\n",++a, a++,a) 输出