【C++永不过时的语言】snprintf()函数返回值的含义
发布日期:2021-06-29 14:30:08 浏览次数:2 分类:技术文章

本文共 721 字,大约阅读时间需要 2 分钟。

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

在这里插入图片描述

学如逆水行舟,不进则退

转载地址:https://chocolate.blog.csdn.net/article/details/104187542 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:【C++永不过时的语言】关于C++中的类型转换
下一篇:【C++永不过时的语言】C/C++指针使用常见的坑

发表评论

最新留言

路过按个爪印,很不错,赞一个!
[***.219.124.196]2024年04月22日 06时24分29秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

干货分享 JVM 之第 4 篇 —— 掌握 Jmeter 压力测试工具,熟悉 Jconsole.exe 工具 2019-04-29
干货分享 JVM 之第 5 篇 —— 类加载器 2019-04-29
干货分享 JVM 之第 6 篇 —— SpringBoot2.0 框架性能调优 2019-04-29
基于 Hystrix 高并发服务限流第 1 篇 —— 必须了解的相关概念 2019-04-29
基于 Hystrix 高并发服务限流第 2 篇 —— 服务隔离(线程池隔离、信号量隔离) 2019-04-29
基于 Hystrix 高并发服务限流第 3 篇 —— 服务熔断、服务降级 2019-04-29
基于 Hystrix 高并发服务限流第 4 篇 —— 基于 Feign 实现服务熔断降级处理 2019-04-29
基于 Hystrix 高并发服务限流第 5 篇 —— Hystrix 监控 2019-04-29
Eureka 如何快速的、优雅的停止某个微服务 2019-04-29
Eureka 实现安全认证 2019-04-29
基于 Hystrix 高并发服务限流第 6 篇 —— 服务限流,基于 RateLimiter 实现 2019-04-29
Nginx 反向代理、负载均衡配置、Location正则表达式 2019-04-29
SpringBoot + WebSocket 实现前后端的收发消息 2019-04-29
SpringBoot 整合 JWT 实现统一认证 2019-04-29
SpringBoot 使用 CompletableFuture 实现非阻塞异步编程 2019-04-29
即刻就业:本科毕业如何快速高薪就业? 2019-04-29
即刻就业:java的应用程序有哪些,java程序有哪些编码规范,开发java应用程序有哪些步骤 2019-04-29
JAVA中的浮点数与二进制 2019-04-29
JAVA笔记(二)--Java初始 2019-04-29
JAVA笔记(三)--变量及运算符 2019-04-29