Вопрос

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

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

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

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

#include <stdio.h>

int main()
{
    printf( "blah \n" );
    getchar();
    return 0;
}
Это было полезно?

Решение

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

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

Видеть этот пост CodingHorror за красивое объяснение.

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

Другие советы

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

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

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

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

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top