(C语言) print输出函数系列介绍
文章目录
前言
起因是因为这么一段祝福语:
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 >= 200809L
Before glibc 2.10:
_GNU_SOURCE
The function dprintf() is the same as fprintf() except that it outputs to a file descriptor, fd, instead of to
a 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) {
// 输出到 stdpout
int ret = puts("Hello World\n");
printf("%d\n", ret);
}
Hello World
0
🖨️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++,算法,计算机知识