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