为什么islower()
和朋友需要处理EOF
,而putchar()
和朋友不必处理?
为什么不islower()
将int
视为unsigned char
,putchar()
就是这种情况?这将是完全有道理的,因为我们必须首先检查EOF
。另请参阅Why the argument type of putchar()
, fputc()
, and putc()
is not char
?
答案 0 :(得分:4)
因为我们必须首先检查EOF。
我们绝对不会。
int c;
while(isspace(c=fgetc(fp)));
if (c==EOF) ...
这是完全合法的代码,可以跳过空格。分别检查每个字符的EOF是浪费时间。
ctype函数专门用于处理EOF以启用这样的代码。
答案 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;进入功能的签名只是与它有轻微关系。