【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)。在项目中也经常用到这个特性进行异常判断,下面就是项目中所用网路框架中的源码,正是因为这段代码才导致自己去查阅相关的资料去弄清楚这个小细节。

在这里插入图片描述

学如逆水行舟,不进则退
发布了491 篇原创文章 · 获赞 1203 · 访问量 18万+

猜你喜欢

转载自blog.csdn.net/weixin_42429718/article/details/104187542