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'
这是循环期间发生的事吗? 感谢。
答案 0 :(得分:2)
你告诉它开始写在第一个循环结束时保持空字节的字符位置,所以它是一个表现良好,顺从的函数,就是它所做的。这样做会破坏事先存在的空字节。
所以是的,sprintf()
会覆盖它写的最后一个空字符(因为你告诉它)。
另一种看待它的方法是sprintf()
返回它写的字符串的长度。在第一次迭代中,这相当于strlen(buf)
。存储在buf + strlen(buf)
的值是“字符串长度”的定义,是终止字符串的空字节。因此,在第二个循环中,您开始在字符串的末尾写入。返回值为您提供了添加到buf
的字符串的长度,因此n += <newlen>
操作为您提供了额外的字符串长度,使循环安全。
理论上,sprintf()
可能会返回负值。我不认为这是重要的,但是如果它确实发生了,你会因为减少而不是增加计数器(n
)而遇到问题。此外,使用snprintf()
可能更安全,但是你必须在每次迭代时调整可用长度,并担心缓冲区溢出(但你不得不担心这些,但你通过分配足够的,或者绰绰有余,首先是空间。)