linux ctrl + d(EOF) 在三种不同情况下的行为
In linux ctrl + d(EOF) behavior in three different situation
//first example
void readInWBW()
{
int ch;
while((ch=getchar()) != EOF)
putchar(ch);
}
当我输入“qweCTRL+D”时,第一次输入ctrl+z时只是刷新缓冲区,然后我重新输入
“ctrl+d”就像“qweCTRL+DCTRL+D”,然后 EOF 工作,程序终止。
结果是
$ ./a.out
qweqwe$
//second example
void guess()
{
int guess = 1;
printf("Pick an integer from 1 to 100. I will try to guess ");
printf("it.\nRespond with a y if my guess is right and with");
printf("\nan n if it is wrong.\n");
printf("Uh...is your number %d?\n", guess);
while (getchar() != 'y'){ //<---------------------------
printf("Well, then, is it %d?\n", ++guess); //<----------
sleep(1);
}
printf("I knew I could do it!\n");
}
在这个例子中,我输入“qweCTRL+D”,它会显示三次“Well, then...”,但是如果我再次输入CTRL+D,程序就会陷入死循环。
结果是:
Pick an integer from 1 to 100. I will try to guess it.
Respond with a y if my guess is right and with
an n if it is wrong.
Uh...is your number 1?
qweWell, then, is it 2? //<--------------------------
Well, then, is it 3?
Well, then, is it 4?
Well, then, is it 5?
Well, then, is it 6?
Well, then, is it 7?
Well, then, is it 8?
Well, then, is it 9?
Well, then, is it 10?
Well, then, is it 11?
^C
//third example
void test()
{
char ch;
while((ch = getchar()) != '#')
putchar(ch);
}
我试过像其他例子一样输入“qweCTRL+D”,但是刷新缓冲区后,“CTRL+D”不再响应,即使我输入“#”,它仍然没有终止。
结果是:
$ ./a.out
qweqwe
#
#
^C
$
我不明白为什么example2和example3中会出现死循环,无法终止程序。谁能解释一下,谢谢
让我们专注于您的第三个示例。
void test()
{
char ch;
while((ch = getchar()) != '#')
putchar(ch);
}
请记住,输入 C-d 表示“文件结束”,因此程序停止响应输入是很自然的。你说没有更多的输入。这就是 EOF 的意思。
所以当你输入了C-d,会发生的是ch = getchar()
会不断的读取EOF。在 C-d 之后输入的任何内容都不会进入输入流。因此,为什么进入无限循环的简单答案是 EOF != '#'
结合 getchar()
总是在读取一次后读取 EOF 的事实。
另一件值得一提的事情是您正在使用缓冲输入。所以 getchar()
只会等到 stdin
中有内容。当您输入几个字符时,它们不会刷新到 stdin
,直到您按回车键或 C-d.
此外,请记住 EOF
不适合 char
。函数 getchar
returns 一个 int
是一个适合 char
或 EOF
的数字。变量 ch
应声明为 int 并正确检查 EOF
.
可以重置 stdin
,但我不确定是否可以通过便携方式重置。但这里有一个问题:
//first example
void readInWBW()
{
int ch;
while((ch=getchar()) != EOF)
putchar(ch);
}
当我输入“qweCTRL+D”时,第一次输入ctrl+z时只是刷新缓冲区,然后我重新输入 “ctrl+d”就像“qweCTRL+DCTRL+D”,然后 EOF 工作,程序终止。 结果是
$ ./a.out
qweqwe$
//second example
void guess()
{
int guess = 1;
printf("Pick an integer from 1 to 100. I will try to guess ");
printf("it.\nRespond with a y if my guess is right and with");
printf("\nan n if it is wrong.\n");
printf("Uh...is your number %d?\n", guess);
while (getchar() != 'y'){ //<---------------------------
printf("Well, then, is it %d?\n", ++guess); //<----------
sleep(1);
}
printf("I knew I could do it!\n");
}
在这个例子中,我输入“qweCTRL+D”,它会显示三次“Well, then...”,但是如果我再次输入CTRL+D,程序就会陷入死循环。 结果是:
Pick an integer from 1 to 100. I will try to guess it.
Respond with a y if my guess is right and with
an n if it is wrong.
Uh...is your number 1?
qweWell, then, is it 2? //<--------------------------
Well, then, is it 3?
Well, then, is it 4?
Well, then, is it 5?
Well, then, is it 6?
Well, then, is it 7?
Well, then, is it 8?
Well, then, is it 9?
Well, then, is it 10?
Well, then, is it 11?
^C
//third example
void test()
{
char ch;
while((ch = getchar()) != '#')
putchar(ch);
}
我试过像其他例子一样输入“qweCTRL+D”,但是刷新缓冲区后,“CTRL+D”不再响应,即使我输入“#”,它仍然没有终止。 结果是:
$ ./a.out
qweqwe
#
#
^C
$
我不明白为什么example2和example3中会出现死循环,无法终止程序。谁能解释一下,谢谢
让我们专注于您的第三个示例。
void test()
{
char ch;
while((ch = getchar()) != '#')
putchar(ch);
}
请记住,输入 C-d 表示“文件结束”,因此程序停止响应输入是很自然的。你说没有更多的输入。这就是 EOF 的意思。
所以当你输入了C-d,会发生的是ch = getchar()
会不断的读取EOF。在 C-d 之后输入的任何内容都不会进入输入流。因此,为什么进入无限循环的简单答案是 EOF != '#'
结合 getchar()
总是在读取一次后读取 EOF 的事实。
另一件值得一提的事情是您正在使用缓冲输入。所以 getchar()
只会等到 stdin
中有内容。当您输入几个字符时,它们不会刷新到 stdin
,直到您按回车键或 C-d.
此外,请记住 EOF
不适合 char
。函数 getchar
returns 一个 int
是一个适合 char
或 EOF
的数字。变量 ch
应声明为 int 并正确检查 EOF
.
可以重置 stdin
,但我不确定是否可以通过便携方式重置。但这里有一个问题: