Перепутанный getchar () функция

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

Так getchar() в основном ожидает меня для нажатия Enter и затем читает отдельный символ.

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

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

#include <stdio.h>

int main()
{
    printf( "blah \n" );
    getchar();
    return 0;
}
16
задан Peter Mortensen 30 October 2010 в 09:58
поделиться

5 ответов

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

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

См. эту публикацию CodingHorror для хорошо сформулированного объяснения.

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

9
ответ дан 30 November 2019 в 21:19
поделиться

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

{ {1}}
1
ответ дан 30 November 2019 в 21:19
поделиться

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

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

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

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

11
ответ дан 30 November 2019 в 21:19
поделиться

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

2
ответ дан 30 November 2019 в 21:19
поделиться

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

#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
ответ дан 30 November 2019 в 21:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: