|   登录   |   注册   |   设为首页   |   加入收藏   

用户登录

close

用户名:

密码:

新用户注册

close

用户名:

密码:

密码确认:

电子邮箱:

关注内容:

个人主页:

帮助

close

龙宇网成立于2008年3月,网站进入整体运作于2010年10月1日。

在这里,我们把它做成了一个真正意义上的网站,完全以个人的信息为内容,以网友的需要为主导,全力搜罗各种信息,建立完善的网站功能,使网友在这里可以第一时间找到所需要的信息。

现在,经过三年的努力,网站的资料已经相当丰富,而网站得到了大家的喜爱和认可。

但,我们还是会继续努力下去,让网间的这份快乐继续持续下去,让这份闲暇时的日子,与快乐一并同行。

寻觅快乐,网住快乐,关注网络,是龙宇网的宣言与承诺。

snprintf()函数返回值“陷阱”

标签: snprintf
分类: 数据结构 发布时间: 2016-12-01 14:58:19 浏览次数: 2274
内容提要: 我最近优化一个Linux-C小程序,用snprintf()函数往数组(或字符串)里写入数据。我不用sprintf()是因为它不够安全,不小心就会内存溢出,导致“段错误”!我认识并使用snprintf()很久了,但今天才完全明白了它的返回值的意思。

~原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://snailwarrior.blog.51cto.com/680306/152913

【小蜗牛清心之作】

我最近优化一个Linux-C小程序,用snprintf()函数往数组(或字符串)里写入数据。我不用sprintf()是因为它不够安全,不小心就会内存溢出,导致“段错误”!我认识并使用snprintf()很久了,但今天才完全明白了它的返回值的意思。

函数原型:
int snprintf(char *str, size_t size, const char *format, ...);

size 的作用就是限制往str写入不超过size个字节(包括了结尾的'\0')。

因为sprintf()函数如果成功的话,返回成功写入的字节数(字符数),我就一直以为snprintf()函数也是如此,也就是snprintf()函数不会返回大于size的整数。

看下面一段手册内容:

The functions snprintf() and vsnprintf() do not  write  more than size bytes (including the trailing ’\0’). If the output was truncated due to this limit then the return value is the number of  characters (not including the trailing ’\0’) which would have been written to the final string if enough space had been  available.  Thus,  a  return value  of  size  or more means that the output was truncated.

如果输出因为size的限制而被截断,返回值将是“如果有足够空间存储,所应能输出的字符数(不包括字符串结尾的'\0')”,这个值和size相等或者比size大!也就是说,如果可以写入的字符串是"0123456789ABCDEF"共16位,但是size限制了是10,这样 snprintf() 的返回值将会是16 而不是10!

上面的内容还说,如果返回值等于或者大于size,则表明输出字符串被截断了(truncated)。

各位~注意啦~

15
20

分类: 数据结构   |   评论: 0   |   引用: 0   |   浏览次数: 2274