Почему это печатает сообщение дважды за итерацию? - PullRequest
1 голос
/ 23 января 2012
            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 ]

4 голосов
/ 23 января 2012

Когда вы вводите одну букву и нажимаете ввод, она помещает 'a\n' в поток.Считывая 1 байт из этого, вы все равно остаетесь с '\n' в потоке, поэтому при следующем вызове read() он читает '\n' вместо блокировки и ожидания ввода пользователя.Вам нужно отбросить '\n', которое осталось в потоке.

1 голос
/ 23 января 2012

Возможно, потому что если вы вводите ,, y '' и нажимаете ввод, вы помещаете строку "y \ n" в буфер - это два символа, и ваша программа пытается прочитать оба из них.

0 голосов
/ 23 января 2012

Это догадка, но поскольку вводимые вами данные являются "a \ n", а не просто "a".Так что в первом цикле читайте блоки, потому что нет данных.Вы вводите «а» и затем нажимаете ввод.Цикл печатает сообщение об ошибке, а затем снова зацикливается.Тем не менее, на этот раз в буфере все еще есть символ перевода строки, и он читается без чтения, когда снова запрашивается ввод.И затем в третий раз буфер исчерпан и снова считывает блоки, ожидая большего ввода.

0 голосов
/ 23 января 2012

Вы должны показать нам больше кода.(когда вы печатаете a?) Я предполагаю, что вы вводите также новые строки, поэтому вы возвращаетесь к началу цикла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...