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

iswctype() 判断宽字符是否属于某个分类

int iswctype(wint_t wc, wctype_t category);

iswctype() 函数用来检测一个宽字符是否属于某个分类。

iswctype() 可以检测一个宽字符是否属于字母、数字、控制字符、空白符等,它将 iswalpha()、isdigit()、iswcntrl()、iswspace() 等宽字符检测函数的功能融为一体,是一个通用的宽字符检测函数。

既然 <wctype.h> 头文件已经包含了各种宽字符检测函数,为什么又提供了一个通用的 iswctype() 呢?因为现有的宽字符检测函数不够用!

C语言支持全球的语言系统,可以处理英文、中文、日文、韩文、德语、法语、拉丁文、希腊文等。在英文以外的语言环境中,可能会包含更多的字符分类,例如日语中还有平假名、片假名、汉字等分类。

字母、数字、控制字符、空白符等是通用的分类,每种语言环境都能够支持;平假名、片假名、汉字等是特定语言相关的分类,并不是所有的语言环境都支持。
我们可以通过 setlocale() 函数进行地域设置,改变程序的语言环境,让程序使用 ASCII 以外的字符集,例如 utf-8(简体中文)、BIG5(繁体中文)、Shift-JIS(日文)、Unicode(世界统一码) 等。
我们可以针对每个通用的分类定义一个函数,但是却不能针对特定语言相关的分类来定义函数,因为:
  • 这些函数在其他的语言文化中不能使用;
  • 特定语言相关的分类可能非常多,会导致定义大量的函数。

于是C语言开发者们想了一个办法,定义一个通用的、不针对特定语言文化的函数,由用户自己指定分类名称,这样用一个函数就可以检测所有分类了,包括通用的分类和特定语言相关的分类,这个函数就是 iswctype()。

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()

参数

  • wc

    要检测的宽字符。它可以是一个有效的宽字符(被转换为 wint_t 类型),也可以是 WEOF(表示无效的宽字符)。
  • category

    指定的字符分类。这里的 category 并不是上表中出现的文本(字符串)形式,而是 wctype_t 类型的标量形式;借助 wctype() 函数可以获取文本对应的标量。

返回值

返回值为非零(真)表示 wc 属于 category 分类,返回值为零(假)表示 wc 不属于 category 分类。

实例

判断一个宽字符串中的字符是否是大写字母,如果是,那么转换为小写字母。
#include <stdio.h>
#include <wctype.h>
int main ()
{
    int i=0;
    wchar_t str[] = L"C/C++ Java Python 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++ java python golang