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

C 为什么需要islower()和朋友来处理EOF?,c,glibc,c-standard-library,C,Glibc,C Standard Library,为什么islower()和朋友需要处理EOF,而putchar()和朋友不需要 为什么islower()不把int当作unsigned char,就像putchar()那样?这是完全有意义的,因为我们必须首先检查EOF。另请参见除忽略它(即返回false)外,不需要任何字符类型函数来处理EOF。事实上,EOF标记是 字符分类函数签名使用有符号或无符号的int代替char,最可能的原因是为了避免在循环中出现实现定义的行为,如: int c; while ((c =getchar()) != EOF

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


为什么
islower()
不把
int
当作
unsigned char
,就像
putchar()
那样?这是完全有意义的,因为我们必须首先检查
EOF
。另请参见

除忽略它(即返回false)外,不需要任何字符类型函数来处理
EOF
。事实上,EOF标记是

字符分类函数签名使用有符号或无符号的
int
代替
char
,最可能的原因是为了避免在循环中出现实现定义的行为,如:

int c;
while ((c =getchar()) != EOF) {
    if (islower(c)) {
        ...
    } else if (isdigi(c)) {
        ...
    }
}
这将使用
islower(char)
而不是
islower(int)
编译和运行,但在这种基本情况下,这是不可取的。本质上,
getchar
的签名中的
int
变成了“传染病”,只进入了与之有轻微关联的函数签名

因为我们必须先检查EOF

我们绝对不会

int c;
while(isspace(c=fgetc(fp)));
if (c==EOF) ...
这是跳过空白的完全合法的代码。单独检查每个字符的EOF是浪费时间的


ctype函数专门用于处理EOF,以启用这样的代码


另请参见。

无符号字符
是古代的东西。它的长度为8位,无法处理非西方语言、重音字母、表情符号等。@Codo:和
islower()
在标准库中可以吗?@RadLexus:我不太确定。如果语言环境设置正确的话,我想是的。在这种情况下,“忽略”是什么意思?函数需要接受EOF并为其返回
false
。这意味着返回EOF不是空格。此外,您还回答了一个完全不同的问题,“为什么isalpha的argulent类型是int”。实际问题是“为什么必须为EOF定义isalpha”。对于不适合无符号字符的任何其他int值,结果是未定义的。EOF标记和。ctype函数是在不导致未定义行为的情况下处理EOF所必需的,因此您没有回答这个问题。@nwellnhof您不清楚什么是未定义行为,以及它与实现定义的行为有何不同。查看
isspace
&朋友们建议明确考虑
-1
#定义isspace(c)((u-ctype+1)[(unsigned int)c]&S)
。这里,
\uu ctype
是一个简单的数组,但请注意相当狡猾的
+1
!“ctype函数专门用于处理EOF,以启用类似这样的代码。”-这在标准中是写在哪里的?这只是你的意见。事情比这更理性。@IgorLiferenko《标准》很少提及其决策的理由,你需要到别处去寻找它们。民间智慧是一个来源。