为什么islower()和朋友需要处理EOF?
为什么islower()
和朋友需要处理EOF
,而putchar()
和朋友不需要?为什么islower()和朋友需要处理EOF?
为什么不将islower()
视为int
为unsigned char
,如putchar()
的情况那样?这样做会很有意义,因为我们必须首先检查EOF
。另请参见Why the argument type of putchar()
, fputc()
, and putc()
is not char
?
除了忽略它(即返回false)之外,不需要任何字符类型函数来处理EOF
。实际上,EOF标记是not even mentioned in <ctype.h>
header documentation。
最可能的原因为字符分类函数签名代替char
,符号或无符号使用int
,是为了避免在循环中这样实现定义:
int c;
while ((c =getchar()) != EOF) {
if (islower(c)) {
...
} else if (isdigi(c)) {
...
}
}
这将编译和运行islower(char)
而不是islower(int)
,但the result would be implementation defined,这在这样的基本情况下是不可取的。实质上,在getchar
签名中的int
变得“具有传染性”,进入功能的签名只与其略有关联。
在这种情况下,“忽略”是什么意思?这些函数需要接受EOF并返回false。 –
意味着返回的EOF不是空间 – Nick
此外,你已经回答了一个完全不同的问题,“为什么isalpha的论证类型是int”。实际的问题是“为什么必须为EOF定义isalpha”。对于任何其他不适合unsigned char的int值,结果都是未定义的。 –
因为我们必须首先检查EOF。
我们绝对不会。
int c;
while(isspace(c=fgetc(fp)));
if (c==EOF) ...
这是完全合法的跳过空格的代码。单独检查EOF的每个字符是浪费时间。
ctype函数专门用于处理EOF以启用这样的代码。请参阅this question。
看看[随机实现](http://research.microsoft.com/en-us/um/redmond/projects/invisible/include/ ctype.h中。(c)((__ctype + 1)[(unsigned int)c]&_ S)'''''''''''''''''在这里'__ctype'是一个简单的数组,但注意相当偷偷摸摸的'+ 1'! – usr2564301
“ctype函数专门用于处理EOF以启用这样的代码。” - 这是写在标准?这只是你的意见。事情比这更合理。 –
@IgorLiferenko标准很少提到其决策的理由,你需要去其他地方找到它们。民间智慧是一个来源。 –
'unsigned char'是古代的事情。由于它的长度为8位,不能与非西方语言一起使用,并带有重音字母,表情符号等。 – Codo
@Codo:和'islower()'在标准库中有吗? – usr2564301
@RadLexus:我不太确定。我认为如果语言环境设置正确的话。 – Codo