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

时间:2013-12-23 16:48:42

标签: 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'
  (删除'\ 0'添加'3'[空格]'\ 0')
  '2'[SPACE] '3'[SPACE] '\ 0'

这是循环期间发生的事吗? 感谢。

1 个答案:

答案 0 :(得分:2)

你告诉它开始写在第一个循环结束时保持空字节的字符位置,所以它是一个表现良好,顺从的函数,就是它所做的。这样做会破坏事先存在的空字节。

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

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

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