fgets ожидает '\ n' перед тем, как получить ввод в буфер [дубликат]

Jan 02 2021

Я пытаюсь использовать fgets из stdin, и он начинает сбор данных с экрана только после того, как я набираю '\ n'. пока символ '\ n' не застрянет.

примечание: у меня в коде нет scanf

соответствующая часть кода:

while (reconnect_flag)
    {
        printf("%s\n", RECONNECT_MENU);
        char Input[2] = "";
        fgets(Input, 2, stdin);
    }

Ответы

JonathanLeffler Jan 03 2021 at 22:43

Поскольку fgets()он предназначен для чтения строки данных, включая первую новую строку (или EOF), он ведет себя так, как задумано.

Кроме того, если вы не сделаете что-то необычное с настройками терминала, терминал не будет отправлять содержимое строки данных программам, читающим с терминала, пока не будет достигнута новая строка. См. Канонический и неканонический ввод терминала для получения дополнительной информации с точки зрения POSIX (Unix). Таким образом, попытка прочитать один символ через fgets(Input, 2, stdin)не получит никакого ввода, пока не будет введена новая строка.

Вы должны работать с API-интерфейсами, зависящими от платформы, если вы хотите вводить данные, как только они становятся доступными. Это означает, что то, что вы делаете в Windows, будет отличаться от того, что вы делаете в системах на основе POSIX - различных разновидностях Unix, включая Linux. Даже в системах на основе POSIX вы можете использовать cursesбиблиотеку или системные вызовы более низкого уровня, и есть несколько способов сделать это.