3

为什么islower()and friends 需要处理EOF,而putchar()and friends 不需要?

为什么不islower()对待intas unsigned char,因为它是这种情况putchar()?这完全有道理,因为EOF无论如何我们都必须先检查。另请参阅为什么putchar(),fputc()putc()is not的参数类型char

4

2 回答 2

4

因为无论如何我们都必须先检查EOF。

我们绝对不会。

int c;
while(isspace(c=fgetc(fp)));
if (c==EOF) ...

这是跳过空格的完全合法的代码。分别检查每个字符的 EOF 是浪费时间。

ctype 函数专门用于处理 EOF 以启用这样的代码。

另请参阅此问题

于 2016-11-21T10:08:41.610 回答
1

EOF除了忽略它(即返回false)之外,不需要处理任何字符类型函数。事实上,头文件中甚至没有提到<ctype.h>EOF 标记。

int使用字符分类函数签名代替、signed 或 unsigned的最可能原因char是避免在这样的循环中实现定义的行为:

int c;
while ((c =getchar()) != EOF) {
    if (islower(c)) {
        ...
    } else if (isdigi(c)) {
        ...
    }
}

islower(char)这将使用而不是编译和运行islower(int),但结果将是 implementation defined,这在这种基本情况下是不可取的。从本质上讲,intgetchar变得“具有传染性”的签名中,进入了与其相关的函数的签名。

于 2016-11-21T09:49:11.290 回答