fprintf
原型:extern int fprintf (FILE *f,const char *s, ...);
可以将字符串输出到某文件中,但更常用的用法是:1
2fprintf(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的话,将不会溢出。
函数返回值:若成功则返回欲写入的字符串长度,若出错则返回负值。1
2
3
4
5
6
7
8
9char 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);
结果:1
2
3s1:abcde, res:7
s1:abc, res:3
s2:abc, res:7
sprintf
int sprintf(char *buffer, const char *format, [ argument] … );
函数功能:把格式化的数据写入某个字符串缓冲区。
函数不安全,写入目标时不会考虑字符数组的大小,要存储的字符超过数组长度时,会导致数组越界,编译不报错但运行报错,所以都会推荐使用snprintf.1
2
3
4
5
6char 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);
结果:1
2s1:abcdef, res:7
s1:abc, res:3