8

我正在使用 gcc (Ubuntu/Linaro 4.6.1-9ubuntu3) 4.6.1

手册页isalnum()说:

SYNOPSIS
       #include <ctype.h>

       int isalnum(int c);

但是,它也说:

这些函数检查 c 是否必须具有 unsigned char或 EOF 的值,...

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

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

4

1 回答 1

7

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

于 2012-07-24T04:13:01.390 回答