为什么islower()和朋友需要处理EOF?

时间:2016-11-21 09:35:58

标签: c glibc c-standard-library

为什么islower()和朋友需要处理EOF,而putchar()和朋友不必处理?

为什么不islower()int视为unsigned charputchar()就是这种情况?这将是完全有道理的,因为我们必须首先检查EOF。另请参阅Why the argument type of putchar(), fputc(), and putc() is not char?

2 个答案:

答案 0 :(得分:4)

  

因为我们必须首先检查EOF。

我们绝对不会。

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

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

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

另见this question

答案 1 :(得分:1)

除了忽略它(即返回false)之外,处理EOF不需要任何字符类型函数。事实上,EOF标记为not even mentioned in <ctype.h> header documentation

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

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

这将编译并运行islower(char)而不是islower(int),而the result would be implementation defined,这在这种基本情况下是不可取的。基本上,int签名中的getchar变得具有传染性,&#34;进入功能的签名只是与它有轻微关系。