将格式化数据写到标准输出,通常称为格式化输出,除了常见的printf外,还有如下四个函数。
1.printf
将格式化数据输出到标准输出。
1)头文件
#include <stdio.h>
2)函数原型
int printf( const char *format, ... );
3)参数
format:表示C 字符串,包含了要打印的格式化数据。
...:表示附加可变参数,根据不同的 format 字符串,函数可能需要一系列的附加参数,每个参数包含了一个要被插入的值,替换了 format 参数中指定的每个 % 标签。参数的个数应与 % 标签的个数相同。
4)返回值
如果成功,返回输出的字符数;如果出错,返回负值。
5)示例
| #include <stdio.h>
int main() { printf("printf testn"); printf("printf test %dn", 2); return 0; } |
6)编译运行并查看测试结果
| printf test
printf test 2 |
2.fprintf
将格式化数据写入到FILE指针指定的文件中。
1)头文件
#include <stdio.h>
2)函数原型
int fprintf(FILE *stream, const char *format, ...);
3)参数
stream:要操作的文件指针。
format:表示C 字符串,包含了要被写入到流 stream 中的数据。
...:表示附加可变参数,根据不同的 format 字符串,函数可能需要一系列的附加参数,每个参数包含了一个要被插入的值,替换了 format 参数中指定的每个 % 标签。参数的个数应与 % 标签的个数相同。
4)返回值
如果成功,返回输出到文件中的字符数;如果出错,返回负值。
5)示例:(打开ftest文件,向标准输出和ftest写入特定数据)
| #include <stdio.h>
int main() { FILE *fp = fopen("ftest", "w+"); if (!fp) { printf("error: ftest openn"); return -1; } fprintf(stdout, "stdout testn"); fprintf(fp, "stdout test %dn", 2); fclose(fp); return 0; } |
6)编译运行并查看测试结果
| stdout test
$ cat ftest //cat查看ftest文件内容 stdout test 2 |
3.dprintf
将格式化数据写入到由文件描述符fd指定的文件中。
1)头文件
#include <stdio.h>
2)函数原型
int dprintf(int fd, const char *format, ...);
3)参数
fd:要操作的文件描述符。
format:表示C 字符串,包含了要被写入到fd中的格式化数据。
...:表示附加可变参数,根据不同的 format 字符串,函数可能需要一系列的附加参数,每个参数包含了一个要被插入的值,替换了 format 参数中指定的每个 % 标签。参数的个数应与 % 标签的个数相同。
4)返回值
如果成功,返回输出到文件中的字符数;如果出错,返回负值。
5)示例:(打开ftest文件,向标准输出和ftest写入特定数据)
| #include <sys/types.h>
#include <sys/stat.h> #include <fcntl.h> #include <stdio.h> int main() { int fd = open("ftest", O_RDWR | O_CREAT | O_TRUNC, 0666); if (fd < 0) { printf("error: ftest openn"); return -1; } dprintf(1, "dprintf testn"); dprintf(fd, "dprintf test %dn", 2); close(fd); return 0; } |
6)编译运行并查看测试结果
| dprintf test
$ cat ftest //cat查看ftest文件内容 dprintf test 2 |
4.sprintf
将格式化数据写入到指定的缓冲区中,并在末尾加结束字符‘‘。注意,由于写入的缓冲区大小可能比数据小,可能出现缓冲区溢出问题。
1)头文件
#include <stdio.h>
2)函数原型
int sprintf(char *buf, const char *format, ...);
3)参数
buf:表示要将数据写入到的字符数组指针。
format:表示C 字符串,包含了要被写入到buf中的格式化数据。
...:表示附加可变参数,根据不同的 format 字符串,函数可能需要一系列的附加参数,每个参数包含了一个要被插入的值,替换了 format 参数中指定的每个 % 标签。参数的个数应与 % 标签的个数相同。
4)返回值
如果成功,返回写入的字符数(不包括加在字符串末尾的结束空字符);如果出错,返回负值。
5)示例:(将数据写入缓冲区,再写入标准输出)
| #include <stdio.h>
int main() { char buf[30]; sprintf(buf, "sprintf testn"); fprintf(stdout, "%s", buf); sprintf(buf, "%dn", 100); fprintf(stdout, "%s", buf); return 0; } |
6)编译运行并查看测试结果
| sprintf test
100 |
5.snprintf
由于sprintf函数可能会发生缓冲区溢出的问题,存在安全隐患,为了解决这个问题,引入了snprintf函数。同样是将格式化数据写入到指定的缓冲区中,并在末尾加结束字符‘‘。而如果写入的字节数大于缓冲区大小,超出的部分将会被丢弃,防止缓冲区溢出。
1)头文件
#include <stdio.h>
2)函数原型
int snprintf(char *buf, size_t size, const char *format, ...);
3)参数
buf:表示要将数据写入到的字符数组指针。
size:表示缓冲区的长度。
format:表示C 字符串,包含了要被写入到buf中的格式化数据,长度为size-1(1为追加的结束字符)。
...:表示附加可变参数,根据不同的 format 字符串,函数可能需要一系列的附加参数,每个参数包含了一个要被插入的值,替换了 format 参数中指定的每个 % 标签。参数的个数应与 % 标签的个数相同。
4)返回值
如果成功,返回写入的字符数(不包括加在字符串末尾的结束空字符);如果出错,返回负值。
5)示例:(将数据写入缓冲区,再写入标准输出)
| #include <stdio.h>
int main() { char buf[5]; snprintf(buf, 5, "snprintf test"); fprintf(stdout, "%sn", buf); snprintf(buf, 5, "%dn", 100); fprintf(stdout, "%s", buf); return 0; } |
6)编译运行并查看测试结果
| snpr //编译时会警告snprintf输出14字节到5字节的缓冲区,属于编译器正常
100 //提示,此处为了验证snprintf的功能,警告可忽略 |
1021