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