fgets czeka na „\ n” przed pobraniem danych wejściowych do bufora [duplikat]

Jan 02 2021

Próbuję użyć fgets ze stdin i zaczyna zbierać dane z ekranu dopiero po wpisaniu '\ n'. dopóki „\ n” nie utknie.

Uwaga: nie mam żadnego scanfa w moim kodzie

odpowiednia część kodu:

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

Odpowiedzi

JonathanLeffler Jan 03 2021 at 22:43

Ponieważ fgets()jest przeznaczony do odczytywania linii danych, aż do pierwszej nowej linii (lub do EOF) włącznie, zachowuje się zgodnie z przeznaczeniem.

Dodatkowo, o ile nie zrobisz czegoś wymyślnego z ustawieniami terminala, terminal nie wyśle ​​zawartości wiersza danych do programów czytających z terminala, dopóki nie zostanie naciśnięty znak nowej linii. Więcej informacji z punktu widzenia POSIX (Unix) można znaleźć w kanonicznych i niekanonicznych wejściach terminali . Więc próba odczytania jednego znaku przez fgets(Input, 2, stdin)nie otrzyma żadnych danych wejściowych, dopóki nie zostanie wprowadzony znak nowej linii.

Musisz pracować z interfejsami API specyficznymi dla platformy, jeśli chcesz wprowadzać dane, gdy tylko będą dostępne. Oznacza to, że to, co robisz w systemie Windows, różni się od tego, co robisz w systemach opartych na POSIX - w różnych odmianach Uniksa, w tym Linuksa. Nawet w systemach opartych na POSIX możesz użyć cursesbiblioteki lub możesz użyć wywołań systemowych niższego poziomu i jest na to wiele sposobów.