snprintf 是否始终为 null 终止目标缓冲区?
换句话说,这是否足够:
char dst[10];
snprintf(dst, sizeof (dst), "blah %s", somestr);
或者如果 somestr 足够长,您是否必须这样做?
char dst[10];
somestr[sizeof (dst) - 1] = '\0';
snprintf(dst, sizeof (dst) - 1, "blah %s", somestr);
我对标准的内容以及一些流行的 libc 可能执行的非标准行为都很感兴趣。
正如其他答案所确定的那样:should:
snprintf... 将结果写入字符串缓冲区。 (...)
将以空字符终止,除非 buf_size 为零。
因此,您需要注意的是不要向其传递零大小的缓冲区,因为(显然)它无法将零写入“无处”。
然而,beware微软的图书馆不具有一个名为snprintf
而是历史上only有一个函数叫做_snprintf
(注意前导下划线)不附加终止空值。这是文档(VS 2012,~~VS 2013):
http://msdn.microsoft.com/en-us/library/2ts7cx93%28v=vs.110%29.aspx
返回值
设 len 为格式化数据字符串的长度(不包括
终止为空)。 _snprintf 的 len 和 count 以字节为单位,wide
_snwprintf 的字符。
(...)
视觉工作室 2015(VC14)显然引入了符合snprintf
函数,但是带有前导下划线和non空终止行为仍然存在:
The snprintf
当 len 大于时,函数截断输出
大于或等于计数,通过将空终止符放置在buffer[count-1]
. (...)
对于所有功能other than snprintf
,如果 len = 计数,则 len
字符存储在缓冲区中,不附加空终止符,
(...)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)