在linux中,ctrl+;三种不同情况下的d(EOF)行为

在linux中,ctrl+;三种不同情况下的d(EOF)行为,c,linux,io,eof,C,Linux,Io,Eof,当我输入“qweCTRL+D”时,第一次输入ctrl+z时,只需刷新缓冲区,然后重新输入 “ctrl+d”类似于“qweCTRL+DCTRL+d”,然后EOF工作,程序终止。 结果是 //first example void readInWBW() { int ch; while((ch=getchar()) != EOF) putchar(ch); } 我尝试像其他示例一样输入“qweCTRL+D”,但在刷新缓冲区后,“CTRL+D”不再响应,即使我输入“

当我输入“qweCTRL+D”时,第一次输入ctrl+z时,只需刷新缓冲区,然后重新输入 “ctrl+d”类似于“qweCTRL+DCTRL+d”,然后EOF工作,程序终止。 结果是

//first example
void readInWBW()
{
    int ch; 
    while((ch=getchar()) != EOF)
        putchar(ch);
}

我尝试像其他示例一样输入“qweCTRL+D”,但在刷新缓冲区后,“CTRL+D”不再响应,即使我输入“#”,它也不会终止。 结果是:

//third example    
void test()
{
    char ch;
    while((ch = getchar()) != '#')
        putchar(ch); 
}

我不明白为什么示例2和示例3有无限循环,不能终止程序。有人能解释一下吗,谢谢。

让我们关注第三个例子

$ ./a.out
qweqwe
#
#
^C
$
请记住,输入C-d意味着“文件结束”,因此程序停止响应输入是很自然的。你说过没有更多的投入。这就是EOF的意思

因此,当您输入C-d时,将会发生的是,
ch=getchar()
将不断读取EOF。在C-d之后键入的任何内容都不会进入输入流。因此,为什么要进入无限循环的简单答案是,
EOF!='#'
以及
getchar()
在读取EOF一次后始终会读取EOF这一事实

另一件值得一提的事情是,您正在使用缓冲输入。因此,
getchar()
将简单地等待,直到
stdin中有东西出现。当您输入几个字符时,在按enter键或C-d键之前,这些字符将不会刷新到stdin

另外,请记住,
EOF
不适合
char
。函数
getchar
返回一个
int
,它是一个适合
char
EOF
的数字。变量
ch
应声明为int,并正确检查
EOF


可以重置
stdin
,但我不确定是否可以以便携方式重置。但这里有一个问题:

让我们关注第三个例子

$ ./a.out
qweqwe
#
#
^C
$
请记住,输入C-d意味着“文件结束”,因此程序停止响应输入是很自然的。你说过没有更多的投入。这就是EOF的意思

因此,当您输入C-d时,将会发生的是,
ch=getchar()
将不断读取EOF。在C-d之后键入的任何内容都不会进入输入流。因此,为什么要进入无限循环的简单答案是,
EOF!='#'
以及
getchar()
在读取EOF一次后始终会读取EOF这一事实

另一件值得一提的事情是,您正在使用缓冲输入。因此,
getchar()
将简单地等待,直到
stdin中有东西出现。当您输入几个字符时,在按enter键或C-d键之前,这些字符将不会刷新到stdin

另外,请记住,
EOF
不适合
char
。函数
getchar
返回一个
int
,它是一个适合
char
EOF
的数字。变量
ch
应声明为int,并正确检查
EOF


可以重置
stdin
,但我不确定是否可以以便携方式重置。但是这里有一个问题:

第二个和第三个示例不检查EOF。第二个和第三个示例不检查EOF。谢谢,这非常有用,我尝试在第三个示例中的“while((ch=getchar())!='#')putchar(ch);”之后插入printf(“1”),并且正如您所解释的,它也会进入无限循环。谢谢,这非常有用,在第三个示例中,我尝试在“while((ch=getchar())!='#')putchar(ch);”之后插入printf(“1”),并且正如您所解释的,它也进入无限循环。
//third example    
void test()
{
    char ch;
    while((ch = getchar()) != '#')
        putchar(ch); 
}
$ ./a.out
qweqwe
#
#
^C
$
void test()
{
    char ch;
    while((ch = getchar()) != '#')
        putchar(ch); 
}