Смущен функцией getchar () - PullRequest
16 голосов
/ 09 марта 2010

Меня смущает роль getchar() в следующем коде. Я имею в виду, я знаю, что это помогает мне увидеть окно вывода, которое будет закрыто только при нажатии клавиши Enter .

Итак, getchar() в основном ждет, пока я нажму клавишу ввода, а затем прочитает один символ.

Что это за символ, который читает эта функция? Я не нажимал ни одной клавиши на клавиатуре, чтобы она читалась.

Теперь, когда он ничего не читает, почему он не выдает ошибку, говорящую "эй, ты не ввел ничего для чтения"?

#include <stdio.h>

int main()
{
    printf( "blah \n" );
    getchar();
    return 0;
}

Ответы [ 6 ]

11 голосов
/ 09 марта 2010

Это потому, что getchar () является блокирующей функцией.

Вы должны прочитать о функциях блокировки , которые в основном заставляют процесс ждать , чтобы что-то произошло.

Реализация этого ожидания зависит от функции, но обычно это цикл, который ожидает какого-то события.

В случае функции getchar() это, вероятно, реализовано в виде цикла, который постоянно читает файл (в данном случае stdin) и проверяет, изменен ли файл. Если файл изменяется, цикл ведет себя как-то иначе.

9 голосов
/ 09 марта 2010

Функция getchar() будет просто ждать, пока не получит символ, удерживая программу до тех пор, пока она не сделает.

Символ отправляется, когда вы нажимаете клавишу ввода; в ОС Windows он отправит возврат каретки (CR) и перевод строки (LF).

См. этот пост CodingHorror , где приведено хорошее объяснение.

(... объяснение части CR + LF, а не блокировки getchar())

4 голосов
/ 09 марта 2010

Попробуйте это:

#include <stdio.h>

int main(int argc, char *argv[])
{
    char ch;

    printf("I'm now going to block until you press something and then return... ");

    ch = getchar();

    if (ch >= 0)
       printf("\nYou pressed %c\n", ch);
    else
       printf("\nAliens have taken over standard input! Run!\n");

    return 0;
}

getchar() приведет к тому, что ваша программа перейдет в спящий режим до тех пор, пока не будет получено прерывание клавиатуры (или что-либо еще подключенное к stdin). Это означает, что он блокируется, дополнительный код не будет выполняться, пока не вернется getchar().

Очень, очень полезно взглянуть на возвращаемое значение функции, чтобы понять его.

Любая функция может блокироваться, если она не обеспечивает какой-либо механизм предотвращения блокировки. Например, open() допускает флаг O_NONBLOCK, который полезен для открытия медленно реагирующих устройств, таких как модемы. Короче говоря, если он получает входные данные от терминала или должен ждать ответа от ядра или какого-либо устройства, есть очень хороший шанс, что он может заблокировать.

2 голосов
/ 09 марта 2010

getchar () блокирует выполнение вашей программы до нажатия клавиши. Таким образом, нет ошибки, если ни одна клавиша не нажата, getchar () будет ждать, пока это произойдет:)

1 голос
/ 09 марта 2010

Вы можете узнать больше о том, как ведет себя getchar здесь: http://www.cppreference.com/wiki/c/io/getchar ... это должно ответить на ваш вопрос:)

0 голосов
/ 17 мая 2019

Я думаю, что вас смущает то, что для продолжения программы необходима клавиша Enter. По умолчанию терминал будет буферизовать всю информацию до тех пор, пока не будет нажата кнопка «Ввод», прежде чем даже отправлять ее в программу C.

см. обсуждение проблемы Enter здесь

...