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)所有,转载请注明来源!
@小甲鱼 小甲鱼老师:上文“函数原型”和“演示”中的头文件不一样,请问哪一个才是正解?{:10_249:} SkyBurner 发表于 2016-4-21 10:20
@小甲鱼 小甲鱼老师:上文“函数原型”和“演示”中的头文件不一样,请问哪一个才是正解?
甲鱼手滑了,snprintf在基本库stdio.h中 get it 甲鱼老师NB! 用64位系统的dev c运行,
buffer里面存的是FishC.
n是-1
这么看来当待写入字符串的长度(包含结束符)大于size时,返回值就是1。
这和小甲鱼讲的: 1.存入buffer的是size-1 2.超出size减一事返回值保持原字符串长度(不包含结束符)都是相悖的。
思来想去可能是编译器或者系统内核的细微差别吧,我还是选择按照自己得实际上机结果去思考问题吧。 太难了{:10_266:} {:10_245:} -1? 逐渐立即一切{:10_256:} {:10_266:} 方便,{:10_281:}
不管超没超出size-1,返回值都是待格式化字符串的长度 n = snprintf(buffer, 6, "FishC.com");这里的第二个为什么是六啊请问?他不是符合format函数不应该用%占位符啥的吗?
经过中文测试表明,返回值是字节数,修正如下:
返回值:函数调用成功,返回被写入字符串的大小(字节),不包括结束符 `\0`,不管缓冲区大小为多少;函数调用失败,返回值是一个负数。只有当返回值小于 size 且非负数,才证明字符串被完全写入
页:
[1]