阅读:0
作者:严长生
为什么<ctype.h>中的函数参数都是int类型
<ctype.h> 头文件中包含了一系列与字符处理有关的函数,这些函数有一个共同特点:它们的参数都是 int 类型。例如:
<ctype.h> 中的字符处理函数除了能够接收 unsigned char 范围内的“普通”字符,还必须能够接收一个无效的字符——EOF。
char 可以隐式地转换为 int,我们在给字符处理函数传参时不需要再进行显式的(强制的)类型转换了。
这就导致不同的标准库之间存在差异,例如在 Visual Studio 中处理 unsigned char 以外的字符会导致断言失败,程序终止执行;而在 Xcode(基于LLVM编译器)中可以顺利处理 unsigned char 以外的字符,比如汉字
- int isalnum ( int c );
- int islower ( int c );
- int isupper ( int c );
- int tolower ( int c );
- int toupper ( int c );
为什么这些函数的参数都是 int 类型?
在编写C语言程序时,我们通常使用char
或者unsigned char
来表示一个字符,而 <ctype.h> 所包含的字符处理函数的参数都是 int 类型,这是为什么呢?<ctype.h> 中的字符处理函数除了能够接收 unsigned char 范围内的“普通”字符,还必须能够接收一个无效的字符——EOF。
EOF 除了可以表示文件结尾,还可以表示一个无效的字符。也就是说,参数要接收的数值范围大于 char 所能表示的数值范围,所以参数的类型必须大于char。大于 char 的类型有 short、int、long 等,C语言标准干脆规定就用 int 吧,这样绰绰有余,弹性很大。
char 可以隐式地转换为 int,我们在给字符处理函数传参时不需要再进行显式的(强制的)类型转换了。
关于 char 以外的字符
C语言标准规定,<ctype.h> 中的字符处理函数至少要能够处理 unsigned char 范围以内的字符,范围以外的字符不做要求,各个组织在实现标准库时可以自由发挥。这就导致不同的标准库之间存在差异,例如在 Visual Studio 中处理 unsigned char 以外的字符会导致断言失败,程序终止执行;而在 Xcode(基于LLVM编译器)中可以顺利处理 unsigned char 以外的字符,比如汉字
"中国我爱你!"
。
在 Debug 模式下断言才会生效。为了让代码更有兼容性,建议使用 <wctype.h> 中的宽字符处理函数来处理 unsigned char 以外的字符。