【C++札记】snprintf()函数返回值的含义
作者:互联网
snprintf()函数是一个非常常用的函数,其作用是往数组(或字符串)里写入数据。不用sprintf()是因为它不够安全,不小心就会内存溢出,导致“段错误”!代码中认识snprintf()已经很久了,但一直没注意其返回值(一直以为返回值和sprintf一样为成功写入的字节数,错误),今天查资料才完全明白了它返回值的意思,先看snprintf()函数的声明:
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)
专注服务器后台技术栈知识总结分享
欢迎关注交流共同进步
码农有道 coding
码农有道,为您提供通俗易懂的技术文章,让技术变的更简单!
标签:函数,snprintf,写入,C++,字符串,返回值,size 来源: https://blog.51cto.com/15006953/2552122