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/