C 言語で stderr に出力

胡金庫 2023年10月12日
  1. C 言語で stderr に出力するには fprintf 関数を使用する
  2. 関数 dprintf を用いて C 言語の stderr に出力する
  3. 関数 fwrite を用いて C 言語の stderr に出力する
C 言語で stderr に出力

この記事では、C 言語で stderr に出力する方法について複数の方法を紹介します。

C 言語で stderr に出力するには fprintf 関数を使用する

C の標準 I/O ライブラリには、プログラムがシステム上で起動されたときに暗黙的に開かれる 3つのテキストストリームが用意されています。これらのストリームは以下の通りです。

  • 標準入力 (stdin) - 入力の読み込みに用いられます。
  • 標準出力 (stdout) - 出力を書き込むために使用します。
  • 標準エラーストリーム (stderr) - 実行時にエラーやデバッグメッセージを記録するために利用します。

これらのストリームにデータを出力するためには、printf ファミリの関数を利用します。fprintf は通常、特定の出力ストリームにテキストを出力するために用いられます。stderr に出力する必要がある場合、stderr のストリームをターゲットにして、関数の第 1 引数にそれを渡します。第 2 引数はフォーマット文字列そのものであり、出力に異なるオブジェクトを含めてフォーマットを構築するための手段を提供します。複数の文字列はコンパイル中に自動的に連結されるので、""には複数の文字列を含めることに注意してください。

#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 という 3つのストリームのマクロ定義が含まれていることに注意してください。また、REDNC という 2つのマクロも定義しています。これらは、出力のテキスト色を変更するための 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 です。これは主にバイナリストリームの入出力に用いられるが、出力ストリームにテキストを出力するために呼び出すこともできます。fwrite は 4つの引数を取り、最初の引数は出力する必要のある文字列へのポインタです。次の 2つの引数はポインタに格納されているデータ項目の数とそれぞれのサイズを指定します。1つの文字列を出力するので、第 3 引数には 1 を指定することができ、サイズは文字列の長さに対応します。第 4 引数には指定したいストリームを指す 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!
著者: 胡金庫
胡金庫 avatar 胡金庫 avatar

DelftStack.comの創設者です。Jinku はロボティクスと自動車産業で8年以上働いています。自動テスト、リモートサーバーからのデータ収集、耐久テストからのレポート作成が必要となったとき、彼はコーディングスキルを磨きました。彼は電気/電子工学のバックグラウンドを持っていますが、組み込みエレクトロニクス、組み込みプログラミング、フロントエンド/バックエンドプログラミングへの関心を広げています。

LinkedIn Facebook

関連記事 - C IO