命名空间
变体
操作

strerror、strerror_s、strerrorlen_s

来自 cppreference.com
< 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 调用它,将写入的未截断特定于区域设置的错误消息的长度。长度不包括空字符结尾。
与所有边界检查函数一样,strerror_sstrerrorlen_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, "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 函数(第 371 页)
  • K.3.7.4.2 strerror_s 函数(第 622 页)
  • K.3.7.4.3 strerrorlen_s 函数(第 623 页)
  • C99 标准(ISO/IEC 9899:1999)
  • 7.21.6.2 strerror 函数(第 334 页)
  • C89/C90 标准(ISO/IEC 9899:1990)
  • 4.11.6.2 strerror 函数

[编辑] 另请参见

将与当前错误相对应的字符字符串显示到 stderr
(函数) [编辑]
宏,展开为兼容 POSIX 的线程局部错误号变量
(宏变量) [编辑]
C++ 文档 for strerror