【发布时间】:2020-09-17 01:13:26
【问题描述】:
我编写了一个程序,它应该计算大小写字母和其他符号,但除了单击 Enter 和 ^C (EOF) 之外,它会计算任何内容。我不知道如何跳过它,希望有人能以某种方式帮助我
#include <stdio.h>
#include <ctype.h>
int main()
{
char ch;
int uppers = 0, lowers = 0, others = 0;
while((ch = getchar()) != EOF)
{
if(islower(ch))
lowers++;
else if(isupper(ch))
uppers++;
else
others++;
}
printf("\n\nUpper letters - %d Lower letters - %d Others- %d", uppers, lowers, others);
return 0;
}
【问题讨论】:
-
使用 ^D 代替 ^C
-
还有:
char ch;-->int ch; -
你能解释一下原因吗?:0
-
因为
EOF是一个定义为(-1)的宏。如果保存到ch中的字符值是255,它将与EOF无法区分,因为对于8 位数据大小,它只是-1的另一种表示。正如您在the docs 中看到的,getchar的签名是int getchar (void)而不是char getchar (void),因此将int值分配给char变量时会发生数据丢失。 -
此外,根据系统架构,默认字符类型甚至可能是_unsigned。在这种情况下,情况正好相反——而不是
255值字符(例如我键盘上的字母ü)与EOF无法区分,因为两者都被视为@ 987654339@ 在已签名char,将来自getchar()调用返回的EOF的EOF(-1) 结果存储到unsignedchar变量中由于空间不足,它变成了实际的255,所以你最终会比较255 == -1,这绝不是真的。
标签: c while-loop counter