为什么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
变得“具有传染性”,进入与其略有关系的函数签名。