strerror, strerror_s, strerrorlen_s
来自cppreference.com
<tbody>
</tbody>
| 在标头 <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) 计算当以
errnum 调用 strerror_s 则本会写入的,本地环境限定错误消息的不截断长度。长度不包含空终止符。
- 同所有边界检查函数,
strerror_s与strerrorlen_s,仅若实现定义__STDC_LIB_EXT1__且用户在包含 <string.h> 前定义__STDC_WANT_LIB_EXT1__为整数常量 1 才保证可用。
参数
| 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, "zh_CN.utf8"); // printf 需要多字节输出的 CTYPE
size_t errmsglen = strerrorlen_s(errno) + 1;
char errmsg[errmsglen];
strerror_s(errmsg, errmsglen, errno);
printf("Now in Chinese: %s\n", errmsg);
#endif
}
}
可能的输出:
File opening error: No such file or directory
Now in German: Datei oder Verzeichnis nicht gefunden
Now in Chinese: 文件或目录不存在
引用
- C11 标准(ISO/IEC 9899:2011):
- 7.24.6.2 The strerror function (第 371 页)
- K.3.7.4.2 The strerror_s function (第 622 页)
- K.3.7.4.3 The strerrorlen_s function (第 623 页)