int iswctype(wint_t wc, wctype_t category);
iswctype() 函数用来检测一个宽字符是否属于某个分类。
iswctype() 可以检测一个宽字符是否属于字母、数字、控制字符、空白符等,它将 iswalpha()、isdigit()、iswcntrl()、iswspace() 等宽字符检测函数的功能融为一体,是一个通用的宽字符检测函数。
既然 <wctype.h> 头文件已经包含了各种宽字符检测函数,为什么又提供了一个通用的 iswctype() 呢?因为现有的宽字符检测函数不够用!
C语言支持全球的语言系统,可以处理英文、中文、日文、韩文、德语、法语、拉丁文、希腊文等。在英文以外的语言环境中,可能会包含更多的字符分类,例如日语中还有平假名、片假名、汉字等分类。
字母、数字、控制字符、空白符等是通用的分类,每种语言环境都能够支持;平假名、片假名、汉字等是特定语言相关的分类,并不是所有的语言环境都支持。
我们可以通过 setlocale() 函数进行地域设置,改变程序的语言环境,让程序使用 ASCII 以外的字符集,例如 GBK(简体中文)、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 属于 category 分类,返回值为零(假)表示 wc 不属于 category 分类。
判断一个宽字符串中的字符是否是大写字母,如果是,那么转换为小写字母。
#include <stdio.h>
#include <wctype.h>
int main ()
{
int i=0;
wchar_t str[] = L"C/C++ Java Python Golang\n";
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;
}
运行结果: