为什么ctype函数需要int,但需要无符号的char/EOF



我使用的是gcc(Ubuntu/Linaro 4.6.1-9ubuntu3)4.6.1

isalnum()的手册页上写着:

SYNOPSIS
       #include <ctype.h>
       int isalnum(int c);

然而,它也说:

这些函数检查c,是否必须具有无符号字符或EOF。。。

我发现,对于非常大的正(或负)int值,isalnum()会爆炸(但它处理所有的short int值)。

手册页是否说传入的int必须具有unsigned char的值,因为C库编写器保留以一种不会处理所有int值而不爆炸的方式实现isalnum()的权利?

C标准说明了。。。

在ISO/IEC 9899:1999(旧的C标准)中,它说:

§7.4字符处理

标头声明了几个对分类和映射有用的函数字符。在所有情况下,自变量都是int,其值应为可表示为无符号字符或应等于宏EOF的值。如果参数具有任何其他值,则行为未定义。

我省略了一个脚注。)C89和C11说的都差不多。

一种常见的实现是使用偏移1的数组——这是主题的变体

int _CtypeBits[257] = { ... };
#define isalpha(c)  (_Ctype_bits[(c)+1]&_ALPHA);

只要cunsigned char可以存储的整数范围内(每个字符有8位,EOF是-1,初始化是正确的),那么这就可以很好地工作。请注意,宏展开只使用一次参数,这是标准的另一个要求。但是,如果将随机值传递到规定的范围之外,则访问随机内存(或者,至少访问未初始化为包含正确信息的内存)。

最新更新