char yes_no = 'z';
int i = 0;
while ( ( yes_no != 'y' ) && ( yes_no != 'n') )
{
read( 0, &yes_no, 1 );
printf("%dA file already exists at your write location. Over write? (y/n)\n", i++);
}
输出如下:
0A file already exists at your write location. Overwrite? (y/n)
1A file already exists at your write location. Overwrite? (y/n)
a
2A file already exists at your write location. Overwrite? (y/n)
3A file already exists at your write location. Overwrite? (y/n)
...等
为什么它会循环两次而不是每次都等待用户输入?
答案 0 :(得分:4)
当您输入一个字母并按Enter键时,它会将'a\n'
放入流中。通过读取1个字节,您仍然在流中留下'\n'
,因此下次调用read()
时,它会读取'\n'
而不是阻止并等待用户输入。您需要丢弃流中剩余的'\n'
。
答案 1 :(得分:1)
可能是因为如果你输入,y''并按回车键,你将字符串“y \ n”放入缓冲区 - 这是两个字符,你的程序试图读取它们。
答案 2 :(得分:0)
您应该向我们展示更多代码。 (当你打印a
?)我猜你也输入换行符,所以你回到循环的开头。
答案 3 :(得分:0)
这是一种预感,但因为您输入的数据是“a \ n”而不仅仅是“a”。所以在第一个循环读取块,因为没有数据。输入“a”然后按Enter键。循环打印错误消息然后再循环。但是,这次缓冲区中仍然存在换行符,并且在没有读取的情况下读取这个字符再次要求输入。然后第三次缓冲区耗尽并再次读取块,等待更多输入。