失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > 三个打印函数printf()/sprintf()/snprintf()区别

三个打印函数printf()/sprintf()/snprintf()区别

时间:2024-03-24 01:03:40

相关推荐

三个打印函数printf()/sprintf()/snprintf()区别

先贴上其函数原型

printf( const char *format, ...) 格式化输出字符串,默认输出到终端-----stdout

sprintf(char *dest, const char *format,...) 格式化输出字符串到指定的缓冲区

snprintf(char *dest, size_t size,const char *format,...) 按指定的SIZE格式化输出字符串到指定的缓冲区

printf()函数在这就不再讨论,这里主要讨论sprintf()与snprintf()的用法及区别,

[plain]view plaincopy #include"stdafx.h"#include<stdio.h>usingnamespacestd;int_tmain(intargc,_TCHAR*argv[]){char*p1="China";chara[20];sprintf(a,"%s",p1);printf("%s\n",a);memset(a,0,sizeof(a));_snprintf(a,3,"%s",p1);printf("%s\n",a);printf("%d\n",strlen(a));return0;}

结果输出:

China

Chi

3

分析:

sprintf(a,"%s",p1) 把p1字符串拷贝到数组a中('\0'也拷贝过去了)。

snprintf(a,3,"%s",p1) 拷贝P1中前3个字符到数组a中,并在末尾自动添加'\0'。

sprintf属于I/O库函数,snprintf函数并不是标准c/c++中规定的函数,但是在许多编译器中,厂商提供了其实现的版本。在gcc中,该函数名称就snprintf,而在VC中称为_snprintf。 如果你在VC中使用snprintf(),会提示此函数未声明,改成_snprintf()即可。

注意点:

1 sprintf是一个不安全函数,src串的长度应该小于dest缓冲区的大小,(如果src串的长度大于或等于dest缓冲区的大小,将会出现内存溢出。)

2 snprintf中源串长度应该小于目标dest缓冲区的大小,且size等于目标dest缓冲区的大小。(如果源串长度大于或等于目标dest缓冲区的大小,且size等于目标dest缓冲区的大小,则只会拷贝目标dest缓冲区的大小减1个字符,后加'\0';该情况下,如果size大于目标dest缓冲区的大小则溢出。)

3 snprintf ()函数返回值问题, 如果输出因为size的限制而被截断,返回值将是“如果有足够空间存储,所应能输出的字符数(不包括字符串结尾的'\0')”,这个值和size相等或者比size大!也就是说,如果可以写入的字符串是"0123456789ABCDEF"共16位,但是size限制了是10,这样 snprintf() 的返回值将会是16而不是10!

如果觉得《三个打印函数printf()/sprintf()/snprintf()区别》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。