为什么ctype函数需要int但需要unsigned char / EOF?

时间:2012-07-24 04:04:37

标签: c

我正在使用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()的权限没有炸毁的价值?

1 个答案:

答案 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);

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