linux 之 snprintf函数用法 分类: arm-linux-Ubuntu 2013-07-30 09:36 1009人阅读 评论(0) 收藏
2013-07-30 09:36
691 查看
int snprintf(char *restrict buf, size_t n, const char * restrict format, ...);
函数说明:最多从源串中拷贝n-1个字符到目标串中,然后再在后面加一个0。所以如果目标串的大小为n 的话,将不会溢出。
函数返回值:若成功则返回欲写入的字符串长度,若出错则返回负值。
Result1(推荐的用法)
#include <stdio.h>
#include <stdlib.h>
int main()
{
char str[10]={0,};
snprintf(str, sizeof(str), "0123456789012345678");
printf("str=%s/n", str);
return 0;
}
root] /root/lindatest
$ ./test
str=012345678
Result2:(不推荐使用)
#include <stdio.h>
#include <stdlib.h>
int main()
{
char str[10]={0, };
snprintf(str, 18, "0123456789012345678");
printf("str=%s/n", str);
return 0;
}
root] /root/lindatest
$ ./test
str=01234567890123456
snprintf函数返回值的测试:
#include <stdio.h>
#include <stdlib.h>
int main()
{
char str1[10] ={0, };
char str2[10] ={0, };
int ret1=0,ret2=0;
ret1=snprintf(str1, sizeof(str1), "%s", "abc");
ret2=snprintf(str2, 4, "%s", "aaabbbccc");
printf("aaabbbccc length=%d/n", strlen("aaabbbccc"));
printf("str1=%s,ret1=%d/n", str1, ret1);
printf("str2=%s,ret2=%d/n", str2, ret2);
return 0;
}
[root] /root/lindatest
$ ./test
aaabbbccc length=9
str1=abc,ret1=3
str2=aaa,ret2=9
解释SIZE:
#include <stdio.h>
#include <stdlib.h>
int main()
{
char dst1[10] ={0, },dst2[10] ={0, };
char src1[10] ="aaa",src2[15] ="aaabbbcccddd";
int size=sizeof(dst1);
int ret1=0, ret2=0;
ret1=snprintf(dst1, size, "str :%s", src1);
ret2=snprintf(dst2, size, "str :%s", src2);
printf("sizeof(dst1)=%d, src1=%s, /"str :%%s/"=%s%s, dst1=%s, ret1=%d/n", sizeof(dst1), src1, "str :", src1, dst1, ret1);
printf("sizeof(dst2)=%d, src2=%s, /"str :%%s/"=%s%s, dst2=%s, ret2=%d/n", sizeof(dst2), src2, "str :", src2, dst2, ret2);
return 0;
}
root] /root/lindatest
$ ./test
sizeof(dst1)=10, src1=aaa, "str :%s"=str :aaa, dst1=str :aaa, ret1=8
sizeof(dst2)=10, src2=aaabbbcccddd, "str :%s"=str :aaabbbcccddd, dst2=str :aaab, ret2=17
补充一下,snprintf的返回值是欲写入的字符串长度,而不是实际写入的字符串度。如:
char test[8];
int ret = snprintf(test,5,"1234567890");
printf("%d|%s/n",ret,test);
运行结果为:
10|1234
函数说明:最多从源串中拷贝n-1个字符到目标串中,然后再在后面加一个0。所以如果目标串的大小为n 的话,将不会溢出。
函数返回值:若成功则返回欲写入的字符串长度,若出错则返回负值。
Result1(推荐的用法)
#include <stdio.h>
#include <stdlib.h>
int main()
{
char str[10]={0,};
snprintf(str, sizeof(str), "0123456789012345678");
printf("str=%s/n", str);
return 0;
}
root] /root/lindatest
$ ./test
str=012345678
Result2:(不推荐使用)
#include <stdio.h>
#include <stdlib.h>
int main()
{
char str[10]={0, };
snprintf(str, 18, "0123456789012345678");
printf("str=%s/n", str);
return 0;
}
root] /root/lindatest
$ ./test
str=01234567890123456
snprintf函数返回值的测试:
#include <stdio.h>
#include <stdlib.h>
int main()
{
char str1[10] ={0, };
char str2[10] ={0, };
int ret1=0,ret2=0;
ret1=snprintf(str1, sizeof(str1), "%s", "abc");
ret2=snprintf(str2, 4, "%s", "aaabbbccc");
printf("aaabbbccc length=%d/n", strlen("aaabbbccc"));
printf("str1=%s,ret1=%d/n", str1, ret1);
printf("str2=%s,ret2=%d/n", str2, ret2);
return 0;
}
[root] /root/lindatest
$ ./test
aaabbbccc length=9
str1=abc,ret1=3
str2=aaa,ret2=9
解释SIZE:
#include <stdio.h>
#include <stdlib.h>
int main()
{
char dst1[10] ={0, },dst2[10] ={0, };
char src1[10] ="aaa",src2[15] ="aaabbbcccddd";
int size=sizeof(dst1);
int ret1=0, ret2=0;
ret1=snprintf(dst1, size, "str :%s", src1);
ret2=snprintf(dst2, size, "str :%s", src2);
printf("sizeof(dst1)=%d, src1=%s, /"str :%%s/"=%s%s, dst1=%s, ret1=%d/n", sizeof(dst1), src1, "str :", src1, dst1, ret1);
printf("sizeof(dst2)=%d, src2=%s, /"str :%%s/"=%s%s, dst2=%s, ret2=%d/n", sizeof(dst2), src2, "str :", src2, dst2, ret2);
return 0;
}
root] /root/lindatest
$ ./test
sizeof(dst1)=10, src1=aaa, "str :%s"=str :aaa, dst1=str :aaa, ret1=8
sizeof(dst2)=10, src2=aaabbbcccddd, "str :%s"=str :aaabbbcccddd, dst2=str :aaab, ret2=17
补充一下,snprintf的返回值是欲写入的字符串长度,而不是实际写入的字符串度。如:
char test[8];
int ret = snprintf(test,5,"1234567890");
printf("%d|%s/n",ret,test);
运行结果为:
10|1234
相关文章推荐
- C语言中的可变参数函数的浅析(以Arm 程序中的printf()函数实现为例) . 分类: HI3531 arm-linux-Ubuntu 2013-12-16 14:19 438人阅读 评论(0) 收藏
- linux 之 getopt_long() 分类: arm-linux-Ubuntu 2013-07-30 09:33 594人阅读 评论(0) 收藏
- Linux内核中常见内存分配函数(二) 分类: arm-linux-Ubuntu 2013-08-08 17:58 723人阅读 评论(0) 收藏
- linux 之 popen函数 分类: arm-linux-Ubuntu 2013-07-30 09:56 642人阅读 评论(0) 收藏
- g++基本用法 分类: arm-linux-Ubuntu 2014-06-18 17:50 414人阅读 评论(0) 收藏
- uboot 添加hello命令 分类: arm-linux-Ubuntu HI3531 2013-12-24 09:22 502人阅读 评论(0) 收藏
- linux下的APK反编译软件及过程介绍 . 分类: arm-linux-Ubuntu 2014-06-18 17:51 400人阅读 评论(0) 收藏
- 重新编译Linux内核必要性及其准备工作 分类: arm-linux-Ubuntu 2013-07-22 16:28 288人阅读 评论(0) 收藏
- ap module omap4460 分类: arm-linux-Ubuntu 2013-07-22 16:29 460人阅读 评论(0) 收藏
- ubuntu中安装man手册查看函数原型 分类: linux使用 2010-02-28 22:50 2453人阅读 评论(0) 收藏 举报 ubuntu语言linuxlibrarysocketsys
- arm-linux-gcc下载与安装 分类: arm-linux-Ubuntu 2013-09-11 14:12 698人阅读 评论(0) 收藏
- OTG驱动分析(一) 分类: arm-linux-Ubuntu USB OTG驱动 2015-06-02 17:32 315人阅读 评论(0) 收藏
- Windows XP下安装WinCE6.0开发环境 分类: arm-linux-Ubuntu 2014-10-13 10:31 555人阅读 评论(0) 收藏
- Linux内核中常见内存分配函数(三) 分类: arm-linux-Ubuntu 2013-08-08 17:59 2550人阅读 评论(0) 收藏
- UBOOT添加命令的执行流程 分类: arm-linux-Ubuntu HI3531 2013-12-24 09:24 514人阅读 评论(0) 收藏
- ubuntu11.04启动 及虚拟文件系统 分类: arm-linux-Ubuntu 2013-07-22 16:28 369人阅读 评论(0) 收藏
- Pandaboard ES编译bootloader、xloader、内核、以及安卓系统 分类: arm-linux-Ubuntu 2013-07-22 16:29 367人阅读 评论(0) 收藏
- 如何编译linux第一个模块 hellomod.ko 分类: arm-linux-Ubuntu 2013-07-22 16:30 286人阅读 评论(0) 收藏
- OTG驱动分析(二) 分类: arm-linux-Ubuntu USB OTG驱动 2015-06-02 17:34 319人阅读 评论(0) 收藏
- ffmpeg+ffserver搭建流媒体服务器 分类: arm-linux-Ubuntu ffmpeg-SDL-VLC-Live555 TI-AM335X 2015-08-04 09:35 6人阅读 评论(0) 收藏