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