名前空間
変種
操作

strerror, strerror_s, strerrorlen_s

提供: cppreference.com
< 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 はスレッドセーフであることは要求されません。 処理系は静的な読み込み専用の文字列リテラルを指す異なるポインタを返すかもしれませんし、 strerror が文字列を置く静的バッファを指す同じポインタを毎回返すかもしれません。
2) (1) と同じですが、メッセージはユーザ提供の記憶域 buf にコピーされます。 最大 bufsz-1 バイトが書き込まれ、バッファは常にヌル終端されます。 バッファに収めるためにメッセージを切り捨てる必要があり、 bufsz が3より大きい場合、 bufsz-4 バイトのみが書き込まれ、ヌル終端の前に文字 "..." が追加されます。 さらに、以下のエラーが実行時に検出され、現在設定されている制約ハンドラ関数を呼びます。
  • buf がヌルポインタ。
  • bufsz がゼロまたは RSIZE_MAX より大きい。
配列の終端を超えて buf への書き込みが発生する場合、動作は未定義です。 これは buf の指すバッファのサイズがエラーメッセージのサイズより小さく、それが bufsz より小さいとき、発生し得ます。
3) errnum を指定して strerror_s が呼ばれた場合に書き込まれるであろうロケール固有のエラーメッセージの切り捨てられていない長さを計算します。 この長さはヌル終端を含みません。
すべての境界チェック付き関数と同様に、 strerror_s および strerrorlen_s__STDC_LIB_EXT1__ が処理系によって定義されていて、 <string.h> をインクルードする前にユーザが __STDC_WANT_LIB_EXT1__ を整数定数 1 に定義した場合にのみ、利用可能であることが保証されます。

目次

[編集] 引数

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

[編集] 戻り値

1) errno のエラーコード errnum に対応するヌル終端バイト文字列を指すポインタ。
2) メッセージ全体の buf への格納が成功した場合はゼロ、そうでなければ非ゼロ。
3) strerror_s が返すであろうメッセージの長さ (ヌル終端を含みません)。

[編集] ノート

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 standard (ISO/IEC 9899:2011):
  • 7.24.6.2 The strerror function (p: 371)
  • K.3.7.4.2 The strerror_s function (p: 622)
  • K.3.7.4.3 The strerrorlen_s function (p: 623)
  • C99 standard (ISO/IEC 9899:1999):
  • 7.21.6.2 The strerror function (p: 334)
  • C89/C90 standard (ISO/IEC 9899:1990):
  • 4.11.6.2 The strerror function

[編集] 関連項目

現在のエラーに対応する文字列を stderr に出力します
(関数) [edit]
POSIX互換のスレッドローカルなエラー番号変数に展開されるマクロ
(マクロ変数)[edit]