C 语言中打印到 stderr
Jinku Hu
2023年10月12日
本文将介绍关于如何在 C 语言中打印到 stderr 的多种方法。
在 C 语言中使用 fprintf
函数打印到 stderr
C 语言的标准 I/O 库提供了三个文本流,当系统启动程序时,这些文本流会被隐式打开。这些文本流是:
- 标准输入(
stdin
) - 用于读取输入。 - 标准输出(
stdout
) - 用于写入输出。 - 标准错误流(
stderr
) - 用于记录运行时的错误或调试信息。
为了将数据打印到这些流中,利用了 printf
系列函数。fprintf
通常被用来将文本输出到特定的输出流。当我们需要打印到 stderr
时,我们的目标是 stderr
流,并将其作为函数的第一个参数。第二个参数是格式字符串本身,它提供了将不同的对象包含到输出中并构造给定格式的方法。请注意,我们在""
中包含多个字符串,因为它们将在编译过程中自动连接。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#define RED "\e[0;31m"
#define NC "\e[0m"
int main(int argc, char *argv[]) {
if (argc != 2) {
fprintf(stderr, RED "[ERROR]" NC
": No string argument provided! \n"
"You must provide a program path as argument\n");
exit(EXIT_FAILURE);
}
char *str = malloc(strlen(argv[1]) + 1);
strcpy(str, argv[1]);
printf("str: %s\n", str);
free(str);
exit(EXIT_SUCCESS);
}
输出:
[ERROR]: No string argument provided!
You must provide a program path as argument
使用 dprintf
函数在 C 语言中打印到 stderr
另外,我们也可以使用 dprintf
函数,它与 fprintf
调用类似,只是它把文件描述符作为第一个参数。基于 Unix 系统的文件描述符是与程序打开的文件相关联的整数值。
请注意,标准的 Unix 头文件–<unistd.h>
中包含了这三个流的宏定义-STDIN_FILENO
、STDOUT_FILENO
和 STDERR_FILENO
。我们还定义了两个宏–RED
和 NC
,这两个宏只是用来修改输出中文本颜色的 ASCII 字符序列。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#define RED "\e[0;31m"
#define NC "\e[0m"
int main(int argc, char *argv[]) {
if (argc != 2) {
dprintf(STDERR_FILENO, RED "[ERROR]" NC
": No string argument provided! \n"
"You must provide a program path as argument\n");
exit(EXIT_FAILURE);
}
char *str = malloc(strlen(argv[1]) + 1);
strcpy(str, argv[1]);
printf("str: %s\n", str);
free(str);
exit(EXIT_SUCCESS);
}
输出:
[ERROR]: No string argument provided!
You must provide a program path as argument
使用 fwrite
函数在 C 语言中打印到 stderr
另一个替代前面的函数是 fwrite
,它主要用于二进制流 I/O,但我们仍然可以调用它来打印文本到输出流。它主要用于二进制流 I/O,但我们仍然可以调用它来打印文本到输出流。fwrite
需要四个参数,其中第一个参数是需要打印的字符串的指针。接下来的两个参数指定了指针处存储的数据项数量的大小和每个数据项的大小。由于我们打印的是单个字符串,所以第三个参数可以是 1
,大小对应的是字符串的长度。第四个参数是指向所需流的 FILE*
。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#define RED "\e[0;31m"
#define NC "\e[0m"
int main(int argc, char *argv[]) {
if (argc != 2) {
fwrite("[ERROR] : No string argument provided!\n", 39, 1, stderr);
exit(EXIT_FAILURE);
}
char *str = malloc(strlen(argv[1]) + 1);
strcpy(str, argv[1]);
printf("str: %s\n", str);
free(str);
exit(EXIT_SUCCESS);
}
输出:
[ERROR] : No string argument provided!
作者: Jinku Hu