strerror_s、_strerror_s、_wcserror_s、__wcserror_s
更新 : 2007 年 11 月
システム エラー メッセージ (strerror_s、_wcserror_s) を取得するか、またはユーザーが指定したエラー メッセージ (_strerror_s、__wcserror_s) を出力します。これらの関数は、「CRT のセキュリティ強化」に説明されているように、strerror、_strerror、_wcserror、__wcserror のセキュリティが強化されたバージョンです。
errno_t strerror_s(
char *buffer,
size_t numberOfElements,
int errnum
);
errno_t _strerror_s(
char *buffer,
size_t numberOfElements,
const char *strErrMsg
);
errno_t _wcserror_s(
wchar_t *buffer,
size_t numberOfElements,
int errnum
);
errno_t __wcserror_s(
wchar_t *buffer,
size_t numberOfElements,
const wchar_t *strErrMsg
);
template <size_t size>
errno_t strerror_s(
char (&buffer)[size],
int errnum
); // C++ only
template <size_t size>
errno_t _strerror_s(
char (&buffer)[size],
const char *strErrMsg
); // C++ only
template <size_t size>
errno_t _wcserror_s(
wchar_t (&buffer)[size],
int errnum
); // C++ only
template <size_t size>
errno_t __wcserror_s(
wchar_t (&buffer)[size],
const wchar_t *strErrMsg
); // C++ only
パラメータ
buffer
エラー文字列を保持するバッファ。numberOfElements
バッファのサイズ。errnum
エラー番号。strErrMsg
ユーザーが指定したメッセージ。
戻り値
正常終了した場合は 0 を返します。失敗した場合はエラー コードを返します。
エラー条件
buffer |
numberOfElements |
strErrMsg |
buffer の内容 |
---|---|---|---|
NULL |
any |
any |
n/a |
any |
0 |
any |
変更されない |
解説
strerror_s 関数は、errnum をエラーメッセージ文字列に割り当て、その文字列へのポインタを返します。_strerror_s 関数はエラー番号を使用しません。この関数では、errno の現在の値を使用して該当するメッセージを判別します。strerror_s 関数も _strerror_s 関数も、実際にはメッセージを出力しません。メッセージを出力するには、次のように fprintf などの出力関数を呼び出す必要があります。
if (( _access( "datafile",2 )) == -1 )
{
_strerror_s(buffer, 80);
fprintf( stderr, buffer );
}
strErrMsg を NULL にすると、_strerror_s 関数は、エラーが発生した最後のライブラリ呼び出しに関するシステム エラー メッセージを含む文字列へのポインタを返します。エラー メッセージ文字列の終端には、改行文字 (\n) が付きます。strErrMsg が NULL ではない場合、_strerror_s 関数は、文字列メッセージ、コロン、空白、エラーが発生した最後のライブラリ呼び出しに関するシステム エラー メッセージ、および改行文字が (この順序で) 入っている文字列へのポインタを返します。文字列メッセージの長さは 94 文字以内です。
これらの関数では、エラー メッセージの長さが numberOfElements -1 を超えた場合、そのエラー メッセージは切り詰められます。結果として buffer に格納される文字列は常に null で終わります。
_strerror_s 関数の実際のエラー番号は、errno 変数に格納されます。システム エラー メッセージは、_sys_errlist 変数から取り出されます。この変数は、エラー番号順に並べられたメッセージの配列です。_strerror_s は、_sys_errlist のインデックスとして errno 値を使用して、該当するエラー メッセージを出力します。_sys_nerr 変数の値は、_sys_errlist 配列の最大要素数として定義されます。正確な結果を得るには、ライブラリ ルーチンからエラーが返された直後に _strerror_s 関数を呼び出します。直後に呼び出さないと、その後 strerror_s 関数または _strerror_s 関数を呼び出したときに errno 値が上書きされることがあります。
_wcserror_s 関数と __wcserror_s 関数は、それぞれ strerror_s 関数と _strerror_s 関数のワイド文字バージョンです。
これらの関数では、パラメータの検証が行われます。buffer が NULL の場合、またはサイズのパラメータが 0 の場合は、「パラメータの検証」に説明されているように、無効なパラメータ ハンドラが呼び出されます。実行の継続が許可された場合、関数は EINVAL を返し、errno を EINVAL に設定します。
_strerror_s, _wcserror_s,、および__wcserror_s の各関数は、ANSI には含まれていない Microsoft 拡張機能です。移植が必要な場合は、これらの関数を使用しないでください。ANSI との互換性を維持するには、 strerror_s 関数を使用します。
C++ では、これらの関数の使用はテンプレートのオーバーロードによって簡素化されます。オーバーロードでは、バッファ長を自動的に推論できるため、サイズの引数を指定する必要がなくなります。詳細については、「セキュリティ保護されたテンプレート オーバーロード」を参照してください。
これらの関数のデバッグ バージョンは、最初にバッファを 0xFD で埋めます。この動作を無効にするには、_CrtSetDebugFillThreshold を使用します。
汎用テキスト ルーチンのマップ
TCHAR.H のルーチン |
_UNICODE および _MBCS が未定義の場合 |
_MBCS が定義されている場合 |
_UNICODE が定義されている場合 |
---|---|---|---|
_tcserror_s |
strerror_s |
strerror_s |
_wcserror_s |
必要条件
ルーチン |
必須ヘッダー |
---|---|
strerror_s, _strerror_s |
<string.h> |
_wcserror_s, __wcserror_s |
<string.h> または <wchar.h> |
互換性の詳細については、「C ランタイム ライブラリ」の「互換性」を参照してください。
使用例
「perror」の例を参照してください。