我正在使用gcc(Ubuntu / Linaro 4.6.1-9ubuntu3)4.6.1
isalnum()
的手册页说:
SYNOPSIS
#include <ctype.h>
int isalnum(int c);
然而,它也说:
这些函数检查c,是否必须具有a的值 unsigned char 或EOF,...
我发现isalnum()
会爆发非常大的正(或负)int
值(但它会处理所有short int
值)。
说明传入的int的手册页是否必须具有unsigned char
的值,因为C库编写者保留以不能处理所有{{1}的方式实现isalnum()
的权限没有炸毁的价值?
答案 0 :(得分:6)
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
,初始化正确),然后这很好用。请注意,宏扩展仅使用参数一次,这是标准的另一个要求。但是,如果您将随机值传递到规定范围之外,则可以访问随机存储器(或者至少是未初始化为包含正确信息的存储器)。