snprintf函数返回值的含义

snprintf()函数是一个非常常用的函数,其作用是往数组(或字符串)里写入数据。不用sprintf()是因为它不够安全,不小心就会内存溢出,导致“段错误”!代码中认识snprintf()已经很久了,但一直没注意其返回值(一直以为返回值和sprintf一样为成功写入的字节数,错误),今天查资料才完全明白了它返回值的意思,先看snprintf()函数的声明:

intsnprintf(char*str, size_t size,constchar*format, ...);

关于函数的功能,应该不用多说了,好了,先看一个例子。

通过上面两个例子可以看出,snprintf()函数的返回值是“要写入的字符串长度(不包括字符串结尾的'\0')”,不管buf是否能装下这个字符串。也就是说,这个值可以和size相等甚至可以比size大!以上面为例,如果可以写入的字符串是"0123456789bcdef"共16位,即使buf的size限制了是10, snprintf() 的返回值将会是16而不是10!查看文档(man 3snprintf)说明也证明了这点。

上面的内容还说,如果返回值等于或者大于size,则表明输出字符串被截断了(truncated)。在项目中也经常用到这个特性进行异常判断,下面就是项目中所用网路框架中的源码,正是因为这段代码才导致自己去查阅相关的资料去弄清楚这个小细节。

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180212B0091E00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券