C 语言中打印到 stderr

Jinku Hu 2023年10月12日
  1. 在 C 语言中使用 fprintf 函数打印到 stderr
  2. 使用 dprintf 函数在 C 语言中打印到 stderr
  3. 使用 fwrite 函数在 C 语言中打印到 stderr
C 语言中打印到 stderr

本文将介绍关于如何在 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_FILENOSTDOUT_FILENOSTDERR_FILENO。我们还定义了两个宏–REDNC,这两个宏只是用来修改输出中文本颜色的 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
Jinku Hu avatar Jinku Hu avatar

DelftStack.com 创始人。Jinku 在机器人和汽车行业工作了8多年。他在自动测试、远程测试及从耐久性测试中创建报告时磨练了自己的编程技能。他拥有电气/电子工程背景,但他也扩展了自己的兴趣到嵌入式电子、嵌入式编程以及前端和后端编程。

LinkedIn Facebook

相关文章 - C IO