int snprintf(char *str, size_t size, const char *format, ...);
关于函数的功能,应该不用多说了,好了,先看一个例子。
运行结果没什么疑问,但是如果buf的大小小于要写入的字节数了,如要写入的是"0123456789bcdef"字符串(16字节,不算空字符‘\0‘),buf大小还是10,再看看snprintf() 函数的返回值。
通过上面两个例子可以看出,snprintf()函数的返回值是“要写入的字符串长度(不包括字符串结尾的‘\0‘)”,不管buf是否能装下这个字符串。也就是说,这个值可以和size相等甚至可以比size大!以上面为例,如果可以写入的字符串是"0123456789bcdef"共16位,即使buf的size限制了是10, snprintf() 的返回值将会是16 而不是10!查看文档(man 3 snprintf)说明也证明了这点。
上面的内容还说,如果返回值等于或者大于size,则表明输出字符串被截断了(truncated)。在项目中也经常用到这个特性进行异常判断,下面就是项目中所用网路框架中的源码,正是因为这段代码才导致自己去查阅相关的资料去弄清楚这个小细节。
精心整理 | 2017下半年文章目录
深入理解系统中log机制(下)
【C++札记】了解 typename 的双重意义
【C++札记】C++对象模型之内存布局(2)
码农有道,为您提供通俗易懂的技术文章,让技术变的更简单!
原文:https://blog.51cto.com/15006953/2552122