我正在使用gcc(Ubuntu/Linaro 4.6.1-9ubuntu3)4.6.1
手册页isalnum()说:
SYNOPSIS
#include <ctype.h>
int isalnum(int c);
Run Code Online (Sandbox Code Playgroud)
但是,它还说:
这些函数检查c是否必须具有unsigned char或EOF 的值,...
我发现isalnum()会爆发非常大的正(或负)int值(但它会处理所有short int值).
说明传入的int的手册页是否必须具有值a,unsigned char因为C库编写者保留了以isalnum()不会在没有爆炸的int情况下处理所有值的方式实现的权利?
C标准说了......
在ISO/IEC 9899:1999(旧的C标准)中,它说:
§7.4字符处理
标头声明了几个用于分类和映射字符的函数.在所有情况下,参数都是一个int,其值应表示为unsigned char或者等于宏EOF的值.如果参数具有任何其他值,则行为未定义.
(我遗漏了一个脚注.)C89和C11都说了很多相同的话.
一个常见的实现是使用1的数组偏移 - 主题的变体:
int _CtypeBits[257] = { ... };
#define isalpha(c) (_Ctype_bits[(c)+1]&_ALPHA);
Run Code Online (Sandbox Code Playgroud)
只要c在unsigned char可以存储的整数范围内(并且每个字符有8位,EOF -1,并且初始化是正确的),那么这可以很好地工作.请注意,宏扩展仅使用参数一次,这是标准的另一个要求.但是,如果您将随机值传递到规定的范围之外,则可以访问随机存储器(或者至少是未初始化为包含正确信息的存储器).