strerror, strerror_s, strerrorlen_s
來自 cppreference.com
定義於標頭檔案 <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
不要求是執行緒安全的。實現可能返回指向靜態只讀字串字面量的不同指標,或者可能反覆返回相同的指標,指向 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_s
和strerrorlen_s
可用。
目錄 |
[編輯] 引數
errnum | - | 表示錯誤碼的整數值 |
buf | - | 指向使用者提供緩衝區的指標 |
bufsz | - | 使用者提供緩衝區的大小 |
[編輯] 返回值
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)