名前空間
変種
操作

strerror、strerror_s、strerrorlen_s

From 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) strerror_serrnumで呼び出された場合に書き込むであろう、切り取られていないロケール固有のエラーメッセージの長さを計算します。長さにはヌル終端文字は含まれません。
すべての境界チェック付き関数と同様に、strerror_sstrerrorlen_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標準 (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互換のスレッドローカルなエラー番号変数に展開されるマクロ
(マクロ変数) [編集]
English 日本語 中文(简体) 中文(繁體)