在linux中,ctrl+;三种不同情况下的d(EOF)行为
当我输入“qweCTRL+D”时,第一次输入ctrl+z时,只需刷新缓冲区,然后重新输入 “ctrl+d”类似于“qweCTRL+DCTRL+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”不再响应,即使我输入“
//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);
}