Namespaces
Variants

strerror, strerror_s, strerrorlen_s

From cppreference.net
< 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_s strerrorlen_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