【发布时间】:2023-10-19 13:00:01
【问题描述】:
下面是一个统计字符数的程序:
#include<stdio.h>
main()
{
long nc;
nc = 0;
while(getchar() != EOF)
++nc;
printf("%ld\n", nc);
}
正如我们在这里看到的那样-Why does getchar() recognize EOF only in the beginning of a line? ctrl+z 在一行字符内写入时不被视为 EOF,仅在写入时才被视为 EOF在行首。
所以这些是程序的以下输出:
123
abs
^Z
8
这里程序返回 8 表示它也在计算 '\n'。
123^Z
abs^Z
^Z
8
它再次返回 8 那么程序在这里做什么呢?它要么忽略 ^Z 作为字符,要么不计算 ^Z 之后的 '\n'。
abc^Zaa
^Z
4
这里程序返回 4,所以这意味着它没有在 ctrl+Z 之后计算 aa。所以我想知道它是否不计算 ^Z 之后的任何字符,或者它也不计算 ^Z 而是计算每行末尾的换行符。那么可以说这里的^Z也起到了行尾的作用吗?
【问题讨论】:
-
问题更多是关于键盘接口和驱动程序而不是 C:什么键算作 字符。 Keys Ctr Z 变成字符
'\1A'或在不同条件下发出“文件结束”信号。 -
建议打印
getchar()返回的值以获得更深入的了解。int c; while((c = getchar()) != EOF) printf("%d %d\n", ++nc, c); -
另外,1999 年是 19 年前 - 你应该编写标准 C,而不是一些史前变体 -
int main(void)。或许还有@chux,printf("%d %hhu", ++nc, (unsigned char)c) -
回想一下这些是 control 字符。当它们控制输入时,它们的作用是与其他字符不同。精确的功能因计算机而异。