0Pricing
C Academy · Lekcja

Typowe pułapki I/O

Problemy z buforem i znakiem nowej linii

Typowe pułapki I/O to bezpłatna lekcja C Academy na CoddyKit. To lekcja 4 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej C Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs C Academy zawiera 4 lekcji w sumie.

Typowe błędy wejścia i wyjścia

Obsługa wejścia i wyjścia w C ma kilka klasycznych pułapek. Ich znajomość pozwala zaoszczędzić wiele godzin debugowania.

#include <stdio.h>
int main(void) {
    printf("Let us study I/O pitfalls\n");
    return 0;
}

Pozostawiony znak nowego wiersza

Po scanf("%d", ...) naciśnięcie klawisza Enter pozostawia w buforze znak \n. Późniejsze %c odczyta ten znak nowego wiersza zamiast właściwych danych.

#include <stdio.h>
int main(void) {
    char c = 'A';
    printf("Use a space before %%c to skip the leftover newline\n");
    printf("c = %c\n", c);
    return 0;
}

Naprawianie problemu za pomocą spacji

Zapisanie scanf(" %c", &c) z początkową spacją informuje scanf, aby najpierw pominął białe znaki.

#include <stdio.h>
int main(void) {
    char c = 'Z';
    printf("scanf(\" %%c\", &c) skips whitespace\n");
    printf("c = %c\n", c);
    return 0;
}

Pomijanie ampersandu

Przekazanie zmiennej do scanf bez & powoduje zapis pod niewłaściwy adres i prawdopodobnie prowadzi do awarii programu.

#include <stdio.h>
int main(void) {
    int n = 9;
    printf("Always pass &n, not n, to scanf for an int\n");
    printf("n = %d\n", n);
    return 0;
}

Niezgodne specyfikatory

Odczytanie wartości double za pomocą %f zamiast %lf w scanf uszkadza wartość. Przy wyświetlaniu %f działa dla obu typów, ale przy wczytywaniu specyfikatory są różne.

#include <stdio.h>
int main(void) {
    double d = 2.5;
    printf("scanf needs %%lf for double; printf uses %%f\n");
    printf("d = %.1f\n", d);
    return 0;
}

Buforowanie wyjścia

Dane wyjściowe mogą być buforowane i nie pojawić się od razu. Zakończenie tekstu za pomocą \n lub wywołanie fflush(stdout) opróżnia bufor.

#include <stdio.h>
int main(void) {
    printf("Flushed by newline\n");
    fflush(stdout);
    return 0;
}

gets jest niebezpieczne

Stara funkcja gets nie sprawdzała rozmiaru bufora i została usunięta ze współczesnego języka C. Zamiast niej używaj fgets.

#include <stdio.h>
int main(void) {
    char buf[10];
    /* fgets(buf, sizeof buf, stdin); */
    buf[0] = 'H'; buf[1] = 'i'; buf[2] = 0;
    printf("buf = %s\n", buf);
    return 0;
}

Przepełnienie bufora za pomocą %s

Zwykłe %s w scanf może zapisywać poza granicami małej tablicy. Ogranicz liczbę znaków szerokością, na przykład %19s.

#include <stdio.h>
int main(void) {
    char name[20];
    printf("Use %%19s to leave room for the null terminator\n");
    name[0] = 0;
    printf("name length cap protects buffer\n");
    return 0;
}

fgets zachowuje znak nowego wiersza

fgets zapisuje końcowy znak nowego wiersza. Często trzeba go usunąć.

#include <stdio.h>
#include <string.h>
int main(void) {
    char line[] = "hello\n";
    line[strcspn(line, "\n")] = 0;
    printf("[%s]\n", line);
    return 0;
}

Ignorowanie wartości zwracanych

Brak sprawdzania wartości zwracanej przez scanf oznacza, że nieprawidłowe dane przechodzą bez ostrzeżenia. Zawsze ją sprawdzaj.

#include <stdio.h>
int main(void) {
    int n = 3;
    int items = 1;
    if (items != 1)
        printf("bad input\n");
    else
        printf("ok: %d\n", n);
    return 0;
}

Bezpieczne składanie wszystkiego w całość

Solidny schemat postępowania to: odczytaj dane za pomocą fgets, przeanalizuj je za pomocą sscanf i sprawdź wynik.

#include <stdio.h>
int main(void) {
    char line[] = "123";
    int n;
    if (sscanf(line, "%d", &n) == 1)
        printf("parsed %d\n", n);
    return 0;
}

Szybkie sprawdzenie

Sprawdź swoją wiedzę na temat pułapek wejścia i wyjścia.

Podsumowanie: typowe pułapki wejścia i wyjścia

Nauczyłeś się unikać typowych błędów.

  • Pozostawione znaki nowego wiersza zakłócają działanie %c; używaj początkowej spacji
  • Zawsze przekazuj adresy za pomocą &
  • Do odczytywania wartości double używaj %lf
  • Preferuj fgets zamiast gets i ograniczaj szerokość %s
  • Sprawdzaj wartości zwracane i opróżniaj bufor wyjścia

Często zadawane pytania

Czy lekcja „Typowe pułapki I/O” jest bezpłatna?

Tak — pełny tekst „Typowe pułapki I/O” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu C Academy, przejdź na CoddyKit PRO. Kurs C Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Typowe pułapki I/O”?

Problemy z buforem i znakiem nowej linii Ćwiczysz C Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć C Academy?

Nie wymagamy żadnego doświadczenia. C Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 4 z 4.

Ile czasu zajmuje lekcja „Typowe pułapki I/O”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji C Academy?

Tak. Każda lekcja C Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Specyfikatory formatu printf
  2. scanf i wejście
  3. Szerokość, precyzja i flagi
  4. Typowe pułapki I/O
← Powrót do C Academy