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

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

为什么islower()int作为unsigned char ,就像putchar() ? 这将是完全有道理的,因为我们必须首先检查EOF 。 另请参见为什么putchar()fputc()putc()的参数类型不是char

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

我们绝对不会。

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

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

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

另见这个问题 。

处理EOF不需要任何字符类型函数,除了忽略它(即返回false)。 实际上, 在头文档中甚至没有提到 EOF标记。

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

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

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