gpt4 book ai didi

c - 为什么 ctype 函数采用 int 但需要 unsigned char/EOF?

转载 作者:太空狗 更新时间:2023-10-29 17:11:19 27 4
gpt4 key购买 nike

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

isalnum() 的手册页说:

SYNOPSIS
#include <ctype.h>

int isalnum(int c);

但是,它还说:

These functions check whether c, which must have the value of an unsigned char or EOF, ...

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

手册页是否说传入的 int 必须具有 unsigned char 的值,因为 C 库编写者保留在 a 中实现 isalnum() 的权利不会在不爆炸的情况下处理所有 int 值的方法?

最佳答案

C 标准说明了很多...

在 ISO/IEC 9899:1999(旧的 C 标准)中,它说:

§7.4 Character handling

The header declares several functions useful for classifying and mapping characters. In all cases the argument is an int, the value of which shall be representable as an unsigned char or shall equal the value of the macro EOF. If the argument has any other value, the behavior is undefined.

(我遗漏了一个脚注。)C89 和 C11 说的非常相似。

一个常见的实现是使用一个偏移量为 1 的数组——主题的变体:

int _CtypeBits[257] = { ... };

#define isalpha(c) (_Ctype_bits[(c)+1]&_ALPHA);

只要c在一个unsigned char可以存储的整数范围内(并且每个字符有8位,EOF就是-1,并且初始化是正确的),那么这个工作很漂亮。请注意,宏扩展仅使用一次参数,这是标准的另一项要求。但是,如果您传递超出规定范围的随机值,您将访问随机内存(或者至少是未初始化为包含正确信息的内存)。

关于c - 为什么 ctype 函数采用 int 但需要 unsigned char/EOF?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11623978/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com