ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

【C++札记】snprintf()函数返回值的含义

2020-11-19 13:51:53  阅读:235  来源: 互联网

标签:函数 snprintf 写入 C++ 字符串 返回值 size


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

int snprintf(char *str, size_t size, const char *format, ...);

关于函数的功能,应该不用多说了,好了,先看一个例子。
【C++札记】snprintf()函数返回值的含义
【C++札记】snprintf()函数返回值的含义
运行结果没什么疑问,但是如果buf的大小小于要写入的字节数了,如要写入的是"0123456789bcdef"字符串(16字节,不算空字符'\0'),buf大小还是10,再看看snprintf() 函数的返回值。
【C++札记】snprintf()函数返回值的含义
【C++札记】snprintf()函数返回值的含义
通过上面两个例子可以看出,snprintf()函数的返回值是“要写入的字符串长度(不包括字符串结尾的'\0')”,不管buf是否能装下这个字符串。也就是说,这个值可以和size相等甚至可以比size大!以上面为例,如果可以写入的字符串是"0123456789bcdef"共16位,即使buf的size限制了是10, snprintf() 的返回值将会是16 而不是10!查看文档(man 3 snprintf)说明也证明了这点。
【C++札记】snprintf()函数返回值的含义
上面的内容还说,如果返回值等于或者大于size,则表明输出字符串被截断了(truncated)。在项目中也经常用到这个特性进行异常判断,下面就是项目中所用网路框架中的源码,正是因为这段代码才导致自己去查阅相关的资料去弄清楚这个小细节。
【C++札记】snprintf()函数返回值的含义

推荐阅读:

精心整理 | 2017下半年文章目录
深入理解系统中log机制(下)
【C++札记】了解 typename 的双重意义
【C++札记】C++对象模型之内存布局(2)

专注服务器后台技术栈知识总结分享

欢迎关注交流共同进步

【C++札记】snprintf()函数返回值的含义

码农有道 coding

码农有道,为您提供通俗易懂的技术文章,让技术变的更简单!

标签:函数,snprintf,写入,C++,字符串,返回值,size
来源: https://blog.51cto.com/15006953/2552122

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有