strerror, strerror_s, strerrorlen_s
来自 cppreference.cn
定义于头文件 <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
,strerror_s
将写入的未截断的特定于区域设置的错误消息的长度。 该长度不包括空终止符。- 与所有边界检查函数一样,只有当实现定义了 __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)