<wctype.h> -- 函数
阅读:0       作者:严长生

wctype() 返回一个标量类型的字符分类

wctype_t wctype (const char* category);

wctype() 函数用来获得一个标量类型的字符分类。

一个宽字符可以是字母、十进制数字、空白符、可打印字符等不同的分类,它们可以由 iswalpha()、iswdigit()、iswspace()、iswprint() 等专门的宽字符检测函数来确定,也可以由 iswctype() 这个通用的宽字符检测函数来确定。

我们可以用文本(字符串)来描述字符的分类,也可以用标量(一般是整数)来描述字符的分类,文本和标量是一一对应的。就像班级里的学生,我们可以喊他的名字(文本),也可以喊他的学号(标量),这两种方式都能够找到唯一的学生。

对于用户来说,文本比标量更加直观,更加容易记忆;对于编程语言来说,标量比文本更加容易处理,计算机底层都是整数。

标量和文本之间往往没有明确的关联,并且标量的值可能会随着不同的库实现、不同的区域设置而变化,要想让用户记住标量的值是不现实的。这样一来就必须提供一个函数,让用户可以通过这个函数获取文本对应的标量,wctype() 就是干这件事的:我们可以给 wctype() 传递一个用文本表示的字符分类,它会返回一个用标量表示的字符分类。

C语言支持全球的语言系统,可以处理英文、中文、日文、韩文、德语、法语、拉丁文、希腊文等。在英文以外的语言环境中,可能会包含更多的字符分类,例如日语中还有平假名、片假名、汉字等分类。
我们可以通过 setlocale() 函数进行地域设置,改变程序的语言环境,让程序使用 ASCII 以外的字符集,例如 utf-8(简体中文)、BIG5(繁体中文)、Shift-JIS(日文)、Unicode(世界统一码) 等。
C语言标准规定,无论在哪种区域设置下,无论在哪种语言环境下,都应该至少包含以下几种字符分类:
文本形式的字符分类 说  明 对应的字符分类函数
"alnum" 字母和十进制数字 iswalnum()
"alpha" 字母 iswalpha()
"blank" 空白符 iswblank()
"cntrl" 控制字符 iswcntrl()
"digit" 十进制数字 iswdigit()
"graph" 图形字符 iswgraph()
"lower" 小写字母 iswlower()
"print" 可打印字符 iswprint()
"punct" 标点符号 iswpunct()
"space" 空白符 iswspace()
"upper" 大写字母 iswupper()
"xdigit" 十六进制数字 iswxdigit()

参数

  • category

    以字符串(文本)形式表示的字符分类(如上表所示)。

返回值

返回一个标量形式(wctype_t 类型)的字符分类。

文本所对应的标量值不是固定的,它可能会随着不同的库实现、不同的区域设置而变化,所以不能直接使用一个固定的标量值,或者猜测标量值,而应该坚持使用 wctype() 函数来获取对应的标量值。

实例

判断宽字符串中的字符是否是大写字母,如何是,那么转换成小写字母。
#include <stdio.h>
#include <wchar.h>
#include <wctype.h>
int main ()
{
    int i=0;
    wchar_t str[] = L"C/C++ Python Java Golangn";
    wchar_t c;
    wctype_t check = wctype("upper");
    wctrans_t trans = wctrans("tolower");
    while (str[i])
    {
        c = str[i];
        if (iswctype(c,check)) c = towctrans(c,trans);
        putwchar (c);
        i++;
    }
    return 0;
}
运行结果:
c/c++ python java golang