名稱空間
變體
操作

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) 計算 strerror_s 在呼叫 errnum 時將寫入的未截斷的區域設定相關錯誤訊息的長度。長度不包括空終止符。
與所有邊界檢查函式一樣,只有當實現定義了 __STDC_LIB_EXT1__ 並且使用者在包含 <string.h> 之前將 __STDC_WANT_LIB_EXT1__ 定義為整數常量 1 時,才能保證 strerror_sstrerrorlen_s 可用。

目錄

[編輯] 引數

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 相容的執行緒區域性錯誤碼變數的宏
(宏變數) [編輯]
C++ 文件,關於 strerror