为什么每次迭代打印两次消息?

时间:2012-01-22 23:36:46

标签: c while-loop

            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)

...等

为什么它会循环两次而不是每次都等待用户输入?

4 个答案:

答案 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键。循环打印错误消息然后再循环。但是,这次缓冲区中仍然存在换行符,并且在没有读取的情况下读取这个字符再次要求输入。然后第三次缓冲区耗尽并再次读取块,等待更多输入。