鱼C论坛

 找回密码
 立即注册
查看: 16089|回复: 14

[函数快查] snprintf -- 写入指定尺寸的格式化数据到字符串

[复制链接]
发表于 2016-2-12 18:59:20 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
snprintf 函数文档


函数概要:

snprintf 函数是 sprintf 函数的安全版本,因为它在调用的时候需要指定缓冲区的最大尺寸,这样可以有效避免缓冲区溢出。

如果写入的字符串尺寸大于 size - 1,那么后边的字符将被丢弃,但依旧会统计进长度中(返回值)。

format 参数后边的额外参数数量由 format 决定,具体用法请参考 printf 函数中格式化占位符的解释。


函数原型:
#include <strdio.h>
...
int snprintf(char *str, size_t size, const char *format, ...);

参数解析:

参数
含义
str 指向存放结果字符串的缓冲区
size 1. 限定缓冲区最大可写入的字节数
2. 字符串最多可以拥有 size - 1 个字符,最后一个空位用于存放 '\0'
3. size_t 被定义为无符号整型
format 格式化字符串
... 可选参数,具体请参考 printf 函数文档


返回值:

如果指定 size 的缓冲区足够存放写入的字符,返回值是实际写入的字符数(不包含表示字符串结束的 '\0');

如果函数调用失败,返回值是一个负数。


注意:

1. 试图写入字符的数量超过 size,并不会导致错误的发生,只是超出部分被丢弃。

2. 只有当返回值小于 size 且非负数,才证明字符串被完全写入。


演示:
#include <stdio.h>

int main()
{
        char buffer[6];
        int n;

        n = snprintf(buffer, 6, "FishC.com");

        printf("buffer:%s\n", buffer);
        printf("n:%d\n", n);

        return 0;
}
搜狗截图20160212190003.png

版权归鱼C工作室(www.fishc.com)所有,转载请注明来源!

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-4-21 10:20:44 | 显示全部楼层
@小甲鱼 小甲鱼老师:上文“函数原型”和“演示”中的头文件不一样,请问哪一个才是正解?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2017-1-11 13:05:27 | 显示全部楼层
SkyBurner 发表于 2016-4-21 10:20
@小甲鱼 小甲鱼老师:上文“函数原型”和“演示”中的头文件不一样,请问哪一个才是正解?

甲鱼手滑了,snprintf在基本库stdio.h中
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-2-14 21:42:18 | 显示全部楼层
get it
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2019-1-14 15:51:57 | 显示全部楼层
甲鱼老师NB!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-8-14 17:22:22 | 显示全部楼层
用64位系统的dev c运行,
buffer里面存的是FishC.
n是-1
这么看来当待写入字符串的长度(包含结束符)大于size时,返回值就是1。
这和小甲鱼讲的: 1.存入buffer的是size-1    2.超出size减一事返回值保持原字符串长度(不包含结束符)都是相悖的。

思来想去可能是编译器或者系统内核的细微差别吧,我还是选择按照自己得实际上机结果去思考问题吧。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 2 反对 0

使用道具 举报

发表于 2020-5-31 16:51:52 | 显示全部楼层
太难了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-20 15:53:25 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-12-19 19:28:23 | 显示全部楼层
-1?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-9-15 22:25:41 | 显示全部楼层
逐渐立即一切
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-6-21 14:17:14 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-12-7 21:18:00 | 显示全部楼层
方便,


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-3-16 06:47:09 From FishC Mobile | 显示全部楼层
不管超没超出size-1,返回值都是待格式化字符串的长度
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-6-1 15:04:49 | 显示全部楼层
n = snprintf(buffer, 6, "FishC.com");这里的第二个为什么是六啊请问?他不是符合format函数不应该用%占位符啥的吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-7-8 10:50:31 | 显示全部楼层
经过中文测试表明,返回值是字节数,修正如下:
返回值:函数调用成功,返回被写入字符串的大小(字节),不包括结束符 `\0`,不管缓冲区大小为多少;函数调用失败,返回值是一个负数。只有当返回值小于 size 且非负数,才证明字符串被完全写入
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-17 03:05

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表