如何解决在linux ctrl + dEOF中三种不同情况下的行为
//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,is it 2? //<--------------------------
Well,is it 3?
Well,is it 4?
Well,is it 5?
Well,is it 6?
Well,is it 7?
Well,is it 8?
Well,is it 9?
Well,is it 10?
Well,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
中有东西。当您输入几个字符时,除非您按Enter或C-d,否则它们不会刷新到stdin
。
另外,请记住EOF
不适合char
。函数getchar
返回一个int
,该数字可以是char
或EOF
中的数字。变量ch
应该声明为int并正确检查EOF
。
可以重置stdin
,尽管我不确定是否可以通过便携式方式进行。但这是一个问题:How to restart stdin after Ctrl+D?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。