strerror, strerror_s, strerrorlen_s
From cppreference.net
|
ヘッダーで定義
<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以降) |
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 | - | ユーザー提供バッファのサイズ |
戻り値
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)