为什么islower()
and friends 需要处理EOF
,而putchar()
and friends 不需要?
为什么不islower()
对待int
as unsigned char
,因为它是这种情况putchar()
?这完全有道理,因为EOF
无论如何我们都必须先检查。另请参阅为什么putchar()
,fputc()
和putc()
is not的参数类型char
?
为什么islower()
and friends 需要处理EOF
,而putchar()
and friends 不需要?
为什么不islower()
对待int
as unsigned char
,因为它是这种情况putchar()
?这完全有道理,因为EOF
无论如何我们都必须先检查。另请参阅为什么putchar()
,fputc()
和putc()
is not的参数类型char
?
因为无论如何我们都必须先检查EOF。
我们绝对不会。
int c;
while(isspace(c=fgetc(fp)));
if (c==EOF) ...
这是跳过空格的完全合法的代码。分别检查每个字符的 EOF 是浪费时间。
ctype 函数专门用于处理 EOF 以启用这样的代码。
另请参阅此问题。
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,这在这种基本情况下是不可取的。从本质上讲,int
在getchar
变得“具有传染性”的签名中,进入了与其相关的函数的签名。