fprintf,snprintf和sprintf函数

fprintf

原型:extern int fprintf (FILE *f,const char *s, ...);
可以将字符串输出到某文件中,但更常用的用法是:

fprintf(stdout,"Hello\n");   //加换行
fprintf(stderr,"World!");

输出Hello换行World。stdout是行缓冲的,输出会放在一个buffer里面,只有到换行的时候,才会输出到屏幕。而stderr是无缓冲的,会直接输出。

snprintf

int snprintf(char *restrict buf, size_t n, const char * restrict format, ...);
函数说明:最多从源串中拷贝n-1个字符到目标串中,然后再在后面加一个0。所以如果目标串的大小为n的话,将不会溢出。
函数返回值:若成功则返回欲写入的字符串长度,若出错则返回负值。

char s1[6] = "12345";
char s2[6] = "67890";
int res;
res = snprintf(s1,sizeof(s1),"abcdefg");    //写入长度大于原来长度,写入abcde和\0,要求6
printf("s1:%s, res:%d\n",s1,res);           //欲写入长度7,这个值是strlen,不包含\0
res = snprintf(s1,sizeof(s1),"abc");        //写入长度少于原来长度,则相当于替换
printf("s1:%s, res:%d\n",s1,res);
res = snprintf(s2,4,"%s","abcdefg");        //指定4,包含了\0
printf("s2:%s, res:%d\n",s2,res);

结果:

s1:abcde, res:7
s1:abc, res:3
s2:abc, res:7

sprintf

int sprintf(char *buffer, const char *format, [ argument] … );
函数功能:把格式化的数据写入某个字符串缓冲区。

函数不安全,写入目标时不会考虑字符数组的大小,要存储的字符超过数组长度时,会导致数组越界,编译不报错但运行报错,所以都会推荐使用snprintf.

    char s1[6] = "12345";
    int res;
    res = sprintf(s1, "%s","abcdefg");   //超出原字符数组长度,不安全
    printf("s1:%s, res:%d\n",s1,res);
    res = sprintf(s1, "%s","abc");
    printf("s1:%s, res:%d\n",s1,res);

结果:

s1:abcdef, res:7
s1:abc, res:3

猜你喜欢

转载自blog.csdn.net/yao5hed/article/details/82186838