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