Подтвердить что ты не робот

Смутно о функции getchar()

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

Итак getchar() в основном ждет меня, чтобы нажать enter, а затем читает один символ.

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

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

#include <stdio.h>

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

Ответ 1

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

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

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

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

Ответ 2

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

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

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

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

Ответ 3

Попробуйте следующее:

#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, который полезен для открытия медленных устройств, таких как модемы. Короче говоря, если он получает вход от терминала или должен ждать, чтобы получить ответ от ядра или какого-либо устройства, есть очень хороший шанс, который он может заблокировать.

Ответ 4

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

Ответ 5

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

Ответ 6

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

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