小甲鱼 发表于 2016-2-12 18:59:20

snprintf -- 写入指定尺寸的格式化数据到字符串

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;
      int n;

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

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

      return 0;
}


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

SkyBurner 发表于 2016-4-21 10:20:44

@小甲鱼 小甲鱼老师:上文“函数原型”和“演示”中的头文件不一样,请问哪一个才是正解?{:10_249:}

zealstar 发表于 2017-1-11 13:05:27

SkyBurner 发表于 2016-4-21 10:20
@小甲鱼 小甲鱼老师:上文“函数原型”和“演示”中的头文件不一样,请问哪一个才是正解?

甲鱼手滑了,snprintf在基本库stdio.h中

mhp0114 发表于 2017-2-14 21:42:18

get it

蓝漠花海 发表于 2019-1-14 15:51:57

甲鱼老师NB!

zhi.wang 发表于 2019-8-14 17:22:22

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

思来想去可能是编译器或者系统内核的细微差别吧,我还是选择按照自己得实际上机结果去思考问题吧。

小夫子啊5 发表于 2020-5-31 16:51:52

太难了{:10_266:}

对方正在输入. 发表于 2020-7-20 15:53:25

{:10_245:}

qiu064987 发表于 2020-12-19 19:28:23

-1?

第一乐章 发表于 2021-9-15 22:25:41

逐渐立即一切{:10_256:}

么么么我爱你 发表于 2022-6-21 14:17:14

{:10_266:}

lskjlx 发表于 2022-12-7 21:18:00

方便,{:10_281:}


jihw1990 发表于 2023-3-16 06:47:09

不管超没超出size-1,返回值都是待格式化字符串的长度

叶惠美 发表于 2023-6-1 15:04:49

n = snprintf(buffer, 6, "FishC.com");这里的第二个为什么是六啊请问?他不是符合format函数不应该用%占位符啥的吗?
页: [1]
查看完整版本: snprintf -- 写入指定尺寸的格式化数据到字符串