输入中的EOF 我的问题是如何在输入的中间解释EOF,这里有一个例子: int main() { int a, b; printf("enter something >\n"); scanf("%d", &a); while((b = getchar()) != EOF) { printf("%i\n", b); } return b; }

输入中的EOF 我的问题是如何在输入的中间解释EOF,这里有一个例子: int main() { int a, b; printf("enter something >\n"); scanf("%d", &a); while((b = getchar()) != EOF) { printf("%i\n", b); } return b; },c,windows,stdin,eof,C,Windows,Stdin,Eof,我运行程序并输入: 1hello^Z(control+z)abc 输出为: 104 (ascii number for h) 101 (for e) 108 (l) 108 (l) 111 (o) 26 (what is this?) 数字1由scanf读取,其余的保留在缓冲区中,getchar()获取所有数字直到^Z,这是控件Z关闭stdin时的预期行为。 然而,26来自哪里?如果getchar()读取的最后一个值是EOF,为什么-1不是最后一个值?还有,为什么这个程序在读

我运行程序并输入:

 1hello^Z(control+z)abc
输出为:

 104 (ascii number for h)
 101 (for e)
 108 (l)
 108 (l) 
 111 (o)
 26 (what is this?)
数字1由scanf读取,其余的保留在缓冲区中,getchar()获取所有数字直到^Z,这是控件Z关闭stdin时的预期行为。 然而,26来自哪里?如果getchar()读取的最后一个值是EOF,为什么-1不是最后一个值?还有,为什么这个程序在读取^Z时没有退出循环,为什么我需要用控件Z再次调用EOF来终止循环?26是SUB的ascii码,我不知道该怎么理解


谢谢。

循环结束时,b=26,因为您输入了ctrl+z,返回时这被解释为SUB

在ASCII和Unicode字符集中,此字符(SUB)由数字26(1A十六进制)编码。当同时按下Ctrl键和Z键时(按惯例,通常称为^Z),标准键盘会传输此代码


Ctrl-Z是ASCII 26。我以为控件Z会自动转换为EOF,EOF有一个负值,通常-1EOF会报告为-1,但它不是真正的转换。DOS/Windows终端有一个讨厌的习惯,即首先在输入中包含Ctrl-Z。可能会有人过来纠正我的细节,但基本上就是这样。你在使用什么操作系统?我有点惊讶你在输入中看到^Z。在Unix(Mac、Linux)上,相应的字符通常是^D(control-D而不是control-Z)。如果在一行中键入一些数据,然后^D,则会发送数据。这是一个非零字节数,因此读取成功(尽管没有换行符),并继续。如果键入更多数据,则在再次键入^D或按换行符(enter)时,这些数据将被读取并返回到应用程序。如果您在一行中键入^D两次,则第二个表示零字节可用,这就是EOF。或者是在行首键入^D。