Namespaces
Variants

strerror, strerror_s, strerrorlen_s

From cppreference.net
< c ‎ | string ‎ | byte
ヘッダーで定義 <string.h>
char * strerror ( int errnum ) ;
(1)
errno_t strerror_s ( char * buf, rsize_t bufsz, errno_t errnum ) ;
(2) (C11以降)
size_t strerrorlen_s ( errno_t errnum ) ;
(3) (C11以降)
1) システムエラーコード errnum のテキスト記述へのポインタを返します。 perror() によって表示される説明と同一です。
errnum は通常 errno 変数から取得されますが、この関数は int 型の任意の値を受け入れます。文字列の内容はロケール固有です。
返される文字列はプログラムによって変更されてはならないが、後続の strerror 関数の呼び出しによって上書きされる可能性がある。 strerror はスレッドセーフである必要はない。実装によっては、静的読み取り専用文字列リテラルへの異なるポインタを返す場合もあれば、静的バッファ内に配置された文字列を指す同じポインタを繰り返し返す場合もある。
2) (1) と同様ですが、メッセージはユーザー提供のストレージ buf にコピーされます。 bufsz-1 バイト以内が書き込まれ、バッファは常にnull終端されます。メッセージがバッファに収まるように切り詰める必要があり、かつ bufsz が3より大きい場合、 bufsz-4 バイトのみが書き込まれ、文字列 "..." がnull終端の前に追加されます。さらに、以下のエラーが実行時に検出され、現在設定されている constraint handler 関数を呼び出します:
  • buf がnullポインタの場合
  • bufsz がゼロまたは RSIZE_MAX より大きい場合
動作は未定義です。もし buf への書き込みが配列の終端を超えて発生した場合、つまり buf が指すバッファのサイズがエラーメッセージの文字数より小さく、かつその文字数が bufsz より小さい場合に発生する可能性があります。
3) strerror_s errnum で呼び出された場合に書き込む、切り詰められていないロケール固有のエラーメッセージの長さを計算します。長さはnull終端文字を含みません。
すべての境界チェック付き関数と同様に、 strerror_s および strerrorlen_s は、実装によって __STDC_LIB_EXT1__ が定義され、かつユーザーが <string.h> をインクルードする前に __STDC_WANT_LIB_EXT1__ を整数定数 1 に定義した場合にのみ利用可能であることが保証されます。

目次

パラメータ

errnum - エラーコードを参照する整数値
buf - ユーザー提供バッファへのポインタ
bufsz - ユーザー提供バッファのサイズ

戻り値

1) errnum エラーコードに対応する、null終端バイト文字列へのポインタ。 errno
2) メッセージ全体が buf に正常に格納された場合はゼロ、それ以外の場合は非ゼロ。
3) strerror_s が返すメッセージの長さ(null終端文字を含まない)

注記

POSIX は、後続の strerror 呼び出しによって、以前の呼び出しで返されたポインタ値を無効化することを許可しています。また、これらのメッセージの内容を制御するのは LC_MESSAGES ロケールファセットであることも規定しています。

strerror_s は、境界チェックを行う関数の中で唯一切り詰めを許可するものです。これは、障害に関する可能な限り多くの情報を提供することがより望ましいと判断されたためです。POSIXも同様の目的で strerror_r を定義しています。

#define __STDC_WANT_LIB_EXT1__ 1
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <locale.h>
int main(void)
{
    FILE *fp = fopen(tmpnam((char[L_tmpnam]){0}), "r");
    if(fp==NULL) {
        printf("File opening error: %s\n", strerror(errno));
        setlocale(LC_MESSAGES, "de_DE.utf8");
        printf("Now in German: %s\n", strerror(errno));
#ifdef __STDC_LIB_EXT1__
        setlocale(LC_ALL, "ja_JP.utf8"); // printf needs CTYPE for multibyte output
        size_t errmsglen = strerrorlen_s(errno) + 1;
        char errmsg[errmsglen]; 
        strerror_s(errmsg, errmsglen, errno);
        printf("Now in Japanese: %s\n", errmsg);
#endif
    }
}

出力例:

File opening error: No such file or directory
Now in German: Datei oder Verzeichnis nicht gefunden
Now in Japanese: そのようなファイル、又はディレクトリはありません

参考文献

  • C11標準 (ISO/IEC 9899:2011):
  • 7.24.6.2 strerror関数 (p: 371)
  • K.3.7.4.2 strerror_s関数 (p: 622)
  • K.3.7.4.3 strerrorlen_s関数 (p: 623)
  • C99標準 (ISO/IEC 9899:1999):
  • 7.21.6.2 strerror関数 (p: 334)
  • C89/C90標準 (ISO/IEC 9899:1990):
  • 4.11.6.2 strerror関数

関連項目

現在のエラーに対応する文字列を stderr に表示する
(関数)
POSIX互換のスレッドローカルエラー番号変数に展開されるマクロ
(マクロ変数)