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

问题描述:

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

为什么不将islower()视为intunsigned char,如putchar()的情况那样?这样做会很有意义,因为我们必须首先检查EOF。另请参见Why the argument type of putchar(), fputc(), and putc() is not char?

+0

'unsigned char'是古代的事情。由于它的长度为8位,不能与非西方语言一起使用,并带有重音字母,表情符号等。 – Codo

+0

@Codo:和'islower()'在标准库中有吗? – usr2564301

+0

@RadLexus:我不太确定。我认为如果语言环境设置正确的话。 – Codo

除了忽略它(即返回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变得“具有传染性”,进入功能的签名只与其略有关联。

+2

在这种情况下,“忽略”是什么意思?这些函数需要接受EOF并返回false。 –

+0

意味着返回的EOF不是空间 – Nick

+2

此外,你已经回答了一个完全不同的问题,“为什么isalpha的论证类型是int”。实际的问题是“为什么必须为EOF定义isalpha”。对于任何其他不适合unsigned char的int值,结果都是未定义的。 –

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

我们绝对不会。

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

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

ctype函数专门用于处理EOF以启用这样的代码。请参阅this question

+0

看看[随机实现](http://research.microsoft.com/en-us/um/redmond/projects/invisible/include/ ctype.h中。(c)((__ctype + 1)[(unsigned int)c]&_ S)'''''''''''''''''在这里'__ctype'是一个简单的数组,但注意相当偷偷摸摸的'+ 1'! – usr2564301

+0

“ctype函数专门用于处理EOF以启用这样的代码。” - 这是写在标准?这只是你的意见。事情比这更合理。 –

+0

@IgorLiferenko标准很少提到其决策的理由,你需要去其他地方找到它们。民间智慧是一个来源。 –