(C语言) print输出函数系列介绍
文章目录
- (C语言) print输出函数系列介绍
- 前言
- 输出系列函数
- 🖨️printf
- 🖨️sprintf & snprintf
- 🖨️fprintf
- 🖨️vprintf
- 🖨️dprintf
- 🖨️puts
- 🖨️fputs
- 🖨️putchar
- 🖨️putc & fputc
- END
前言
起因是因为这么一段祝福语:
Linux 和 libc 给您
拜 年 啦
在这辞旧迎新的美好时刻:
🧨 printf 携手 fprintf, dprintf, sprintf, snprintf, vprintf, vfprintf, vdprintf, vsprintf, vsnprintf, fputc, fputs, putc, putchar, puts 祝您新的一年能大展宏图
🧨 scanf 携 sscanf, vsscanf, fscanf, vscanf, vfscanf, fgetc, fgets, getc, getchar 祝您财源广进,金银满仓,钱途无量
🧨 exit, _exit, _Exit, atexit, on_exit, quick_exit, at_quick_exit 希望您在这一年终末,能够善始善终,圆满收官
🧨 execl, execlp, execle, execv, execvp, execvpe 愿您新的一年开启新篇章,事业生活蒸蒸日上
🧨 fork, vfork, clone, __clone2, clone3 祝您家庭美满,阖家欢乐
🧨 wait, waitpid, waitid, wait3, wait4 希望各位都能遇得良机和贵人,新的一年一帆风顺
🧨 signal, sigaction, sigvec, sigblock, sigsetmask, siggetmask, sigmask, setjmp, sigsetjmp, longjmp, siglongjmp 愿您新的一年能逢凶化吉,巧解难题
最后,alarm, sleep, usleep, nanosleep, clock_nanosleep, pause 愿您新的一年能安枕无忧,好睡眠,身体康健祝大家新年快乐,万事如意!
输出系列函数
🖨️printf
// (C99 前)
int printf( const char *format, ... );
// (C99 起)
int printf( const char *restrict format, ... );
从给定位置加载数据,转换为字符串等价物,并写结果到各种池。
写结果到 stdout 。
#include <stdio.h>int main() {int ret = printf("Hello World\n");printf("ret = %d\n", ret);
}
Hello World
ret = 12
🖨️sprintf & snprintf
✍️sprintf
// (C99 前)
int sprintf( char *buffer, const char *format, ... );
// (C99 起)
int sprintf( char *restrict buffer, const char *restrict format, ... );
从给定位置加载数据,转换为字符串等价物,并写结果到各种池。
写结果到字符串 buffer
。
将字符输出到第一个
char*
的参数中。结尾会补
\0
。
#include <stdio.h>int main() {char str[1024] = "0123456789";// 尾部会补'\0'int ret = sprintf(str, "Hello World");printf("%s\n", str);return 0;
}
Hello World
snprintf
// (C99 起)
int snprintf( char *restrict buffer, int bufsz, const char *restrict format, ... );
// (C11 起)
int snprintf_s(char *restrict buffer, rsize_t bufsz, const char *restrict format, ...);
从给定位置加载数据,转换为字符串等价物,并写结果到各种池。
写结果到字符串 buffer
。至多写 buf_size
- 1 个字符。产生的字符串会以空字符终止,除非 buf_size
为零。若 buf_size
为零,则不写入任何内容,且 buffer
可以是空指针,然而依旧计算返回值(会写入的字符数,不包含空终止符)并返回。
同样是输出到指定的
char*
中,但是有第二个参数来指定输出长度。结尾不会补
\0
。
#include <stdio.h>
#include <string.h>int main() {char str[1024] = "0123456789";int len = 5;// 尾部不加'\0'snprintf(str, 5, "Hello World\n");printf("strlen()=%d str=%s\n", strlen(str), str);str[len] = '\0';printf("strlen()=%d str=%s\n", strlen(str), str);
}
strlen()=10 str=Hello56789
strlen()=5 str=Hello
🖨️fprintf
// (C99 前)
int fprintf( FILE *stream, const char *format, ... );
// (C99 起)
int fprintf( FILE *restrict stream, const char *restrict format, ... );
从给定位置加载数据,转换为字符串等价物,并写结果到各种池。
写结果到文件流 stream
。
输出到指定的文件中
FILE*
。
#include <stdio.h>int main() {FILE* pfile = fopen("out.txt", "w+");if (pfile) {fprintf(pfile, "Hello World");fclose(pfile);}
}
# 生成一个名为“out.txt”的函数
# 并在文件中写入:Hello World
🖨️vprintf
// (C99 前)
int vprintf( const char *format, va_list vlist );
// (C99 起)
int vprintf( const char *restrict format, va_list vlist );
vlist
所定义的位置加载数据,将它们转换成字符串等价物,并将结果写入各种池。
写结果到 stdout。
变参输出,用于C语言式的变参函数的输出。
注意一下C语言中变参函数的使用方式。
#include <stdarg.h>
#include <stdio.h>/*** C语言的变参函数* - va_start* - va_end*/
void test_variable(const char *format, ...) {va_list args;va_start(args, format);// 打印变参内容vprintf(format, args);va_end(args);
}int main() {test_variable("Func[%s] Line[%d]\n", __func__, __LINE__);
}
Func[main] Line[18]
🖨️dprintf
int dprintf(int fd, const char *format, ...);
dprintf(), vdprintf():Since glibc 2.10:_POSIX_C_SOURCE >= 200809LBefore glibc 2.10:_GNU_SOURCEThe function dprintf() is the same as fprintf() except that it outputs to a file descriptor, fd, instead of toa stdio stream.
这是一个非跨平台函数,输出到指定的fd当中。
注意:经测试linux中可行,windows中不行。
/*** linux code*/
#include <stdio.h>
#include <unistd.h>int main() {// int dprintf(int fd, const char *format, ...);dprintf(STDOUT_FILENO, "Hello World\n");return 0;
}
Hello World
🖨️puts
int puts( const char *str );
写入每个来自空终止字符串 str
的字符及附加换行符 ‘\n’ 到输出流 stdout
,如同以重复执行 putc 写入。
不写入来自 str
的空终止字符
#include <stdio.h>int main(void) {// 输出到 stdpoutint ret = puts("Hello World\n");printf("%d\n", ret);
}
Hello World0
🖨️fputs
// (C99 前)
int fputs( const char *str, FILE *stream );
// (C99 起)
int fputs( const char *restrict str, FILE *restrict stream );
写入字符 ch
到给定输出流 stream
。 putc() 可以实现为宏并对 stream
求值超过一次,故对应的参数决不应是有副效应的表达式。
在内部,在写入前将字符转换为 unsigned char 。
#include <errno.h>
#include <stdio.h>int main(void) {// 传入空指针,保证出现错误int ret = fputs("Hello World", NULL);if (ret == EOF) {perror("fputs() errno");}
}
fputs() errno: Invalid argument
🖨️putchar
int putchar( int ch );
写字符 ch
到 stdout
。在内部,字符于写入前被转换到 unsigned char 。
等价于 putc(ch, stdout)
。
#include <stdio.h>int main(void) {for (char c = 'a'; c != 'z'; c += 1) {int ret = putchar(c);if (ret == EOF) {if (ferror(stdout)) {perror("putchar() failed\n");break;}}} // for
}
abcdefghijklmnopqrstuvwxy
🖨️putc & fputc
int fputc( int ch, FILE *stream );
int putc( int ch, FILE *stream );
输出单个字符到第二个参数设定的流中。
#include <stdio.h>int main(void) {for (char c = 'a'; c != 'z'; c += 1) {int ret;if (c & 1) {ret = putc(c, stdout);} else {ret = fputc(c, stdout);}if (ret == EOF) {if (ferror(stdout)) {perror("putc() failed\n");break;}}} // for
}
abcdefghijklmnopqrstuvwxy
END
关注我,学习更多C/C++,算法,计算机知识