文字
分享

在头文件<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会编写的未截断的特定于语言环境的错误消息的长度。 该长度不包括空终止符。 与所有边界检查函数一样,只有在__STDC_LIB_EXT1__由实现定义且用户在包含string.h之前将__STDC_WANT_LIB_EXT1__定义为整数常量1时,strerror_s和strerrorlen_s才能保证可用。

参数

差错编号

-

整数值是指错误代码

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 needs CTYPE for multibyte output
        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 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函数

扩展内容

PERROR

显示当前错误对应的字符串到stderr(函数)

errno

宏扩展到POSIX兼容的线程局部错误号变量(宏变量)

在头文件<wctype.h>中定义



int iswdigit(wint_t ch);


(自C95以来)

检查给定的宽字符是否对应(如果缩小)十个十进制数字字符0123456789中的一个。

参数

CH

-

宽字符

返回值

如果宽字符是数字字符,则为非零值,否则为零。

注意

iswdigitiswxdigit是唯一不受当前安装的C语言环境影响的标准宽字符分类函数。

一些语言环境提供了检测非ASCII数字的附加字符类。

#include <stdio.h>#include <wctype.h>#include <wchar.h>#include <locale.h> void test(wchar_t a3, wchar_t u3, wchar_t j3){    printf("        '%lc' '%lc' '%lc'\n", a3, u3, j3);    printf("iswdigit %d    %d   %d\n",           !!iswdigit(a3), !!iswdigit(u3), !!iswdigit(j3));    printf("jdigit:  %d    %d   %d\n", !!iswctype(a3, wctype("jdigit")),          !!iswctype(u3, wctype("jdigit")),          !!iswctype(j3, wctype("jdigit")));}
 int main(void){
    wchar_t a3 = L'3';  // the ASCII digit 3
    wchar_t u3 = L'三'; // the CJK numeral 3
    wchar_t j3 = L'3'; // the fullwidth digit 3 
    setlocale(LC_ALL, "en_US.utf8");    puts("In American locale:");    test(a3, u3, j3); 
    setlocale(LC_ALL, "ja_JP.utf8");    puts("\nIn Japanese locale:");    test(a3, u3, j3);}

输出:

In American locale:        '3' '三' '3'iswdigit 1    0   0jdigit:  0    0   0
 In Japanese locale:        '3' '三' '3'iswdigit 1    0   0jdigit:  0    0   1

参考

  • C11标准(ISO / IEC 9899:2011):

    • 7.30.2.1.5 iswdigit函数(p:449)

  • C99标准(ISO / IEC 9899:1999):

    • 7.25.2.1.5 iswdigit函数(p:395)

扩展内容

isdigit

检查一个字符是否是一个数字(功能)

| 用于iswdigit的C ++文档 |

ASCII 值  (十六进制)

字符

iscntrl  iswcntrl.

isprint  iswprint.

isspace  iswspace.

isblank  iswblank.

isgraph  iswgraph.

ispunct  iswpunct.

isalnum  iswalnum.

isalpha  iswalpha.

isupper  iswupper.

islower  iswlower.

isdigit  iswdigit.

isxdigit  iswxdigit.


0 - 8

0x00-0x08

控制码 (NUL, etc.)

≠0

0

0

0

0

0

0

0

0

0

0

0

9

0x09

tab (\t)

≠0

0

≠0

≠0

0

0

0

0

0

0

0

0

10 - 13

0x0A-0x0D

空格 (\n,\v,\f,\r)

≠0

0

≠0

0

0

0

0

0

0

0

0

0

14 - 31

0x0E-0x1F

控制码

≠0

0

0

0

0

0

0

0

0

0

0

0

32

0x20

space

0

≠0

≠0

≠0

0

0

0

0

0

0

0

0

33 - 47

0x21-0x2F

!"#$%&'()*+,-./

0

≠0

0

0

≠0

≠0

0

0

0

0

0

0

48 - 57

0x30-0x39

0123456789

0

≠0

0

0

≠0

0

≠0

0

0

0

≠0

≠0

58 - 64

0x3a-0x40

:;<=>?@

0

≠0

0

0

≠0

≠0

0

0

0

0

0

0

65 - 70

0x41-0x46

ABCDEF

0

≠0

0

0

≠0

0

≠0

≠0

≠0

0

0

≠0

71 - 90

0x47-0x5A

GHIJKLMNOPQRSTUVWXYZ

0

≠0

0

0

≠0

0

≠0

≠0

≠0

0

0

0

91 - 96

0x5B-0x60

[]^_` | 0 | ≠0 | 0 | 0 | ≠0 | ≠0 | 0 | 0 | 0 | 0 | 0 | 0 |













97 -102

0x61-0x66

abcdef

0

≠0

0

0

≠0

0

≠0

≠0

0

≠0

0

≠0

103-122

0x67-0x7A

ghijklmnopqrstuvwxyz

0

≠0

0

0

≠0

0

≠0

≠0

0

≠0

0

0

123-126

0x7B-0x7E

{|}~

0

≠0

0

0

≠0

≠0

0

0

0

0

0

0

127

0x7F

退格 (DEL)

≠0

0

0

0

0

0

0

0

0

0

0

0

上一篇:strerror下一篇:strerror_s