您当前的位置:首页 > 计算机 > 编程开发 > VC/VC++

为什么<ctype.h>中的函数参数都是int类型

时间:12-26来源:作者:点击数:

<ctype.h> 头文件中包含了一系列与字符处理有关的函数,这些函数有一个共同特点:它们的参数都是 int 类型。例如:

  • 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 以外的字符。

方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门