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
不要求是线程安全的。实现可能返回指向静态只读字符串字面量的不同指针,也可能反复返回相同的指针,指向 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)