Dane wejściowe są siłą napędową każdego programu interaktywnego. Bez tego będziesz po prostu używać kalkulatora w próżni. W języku programowania C głównym narzędziem do pobierania danych z klawiatury jest „scanf”. To proste. Jest wszechobecne. Ale słynie też z bezwzględności wobec błędów.
W przypadku prostych skryptów lub szybkich prototypów polecenie „scanf” załatwia sprawę. Odczytuje z stdin (standardowe wejście). Jeśli piszesz na klawiaturze, właśnie tam trafiają Twoje znaki. Funkcja jest uniwersalna, ale brakuje jej niezawodnej obsługi błędów. Nie obchodzi ją, czy wpiszesz literę, gdy ona spodziewa się cyfry. Po prostu zawiesi się lub, co gorsza, spowoduje awarię programu. Dlatego świetnie nadaje się do prostych zadań, ale nie nadaje się do oprogramowania klasy produkcyjnej.
Składnia i ampersand
Przyjrzyjmy się najprostszemu możliwemu przypadkowi użycia. Potrzebujesz liczby całkowitej. Żądasz tego. Zapisz to.
scanf("%d", &b);
To wszystko. Dwa argumenty. Sformatuj ciąg znaków i zmienną docelową.
%d mówi scanf, aby oczekiwał liczby całkowitej. Jest to ten sam symbol zastępczy, którego używasz w printf. Zmienna „b” musi być zadeklarowana jako „int”. Jeśli tak nie jest, prosisz się o kłopoty.
Oto część, która za każdym razem dezorientuje nowicjuszy: ampersand („&”).
„&b” nie jest literówką. To jest wskaźnik. W szczególności jest to adres zmiennej „b”. scanf nie przyjmuje wartości, ale potrzebuje miejsca w pamięci, w którym może zapisać wprowadzone dane. Zapomniałem &. Twój kod może się skompilować. Ale kiedy go uruchomisz? Zawalić się. Segfault. Pustka. Program prawie na pewno ulegnie awarii, ponieważ będzie próbował zapisać dane pod losowym adresem pamięci.
Formatowanie flag
scanf używa tych samych specyfikatorów konwersji co printf. Jeśli znasz jedno, znasz i drugie. Ale kontekst ma znaczenie.
- Całkowita :
%d - Liczby zmiennoprzecinkowe :
%f - Pojedyncze znaki :
%c - Linie :
%s
Nie myl ich. Zamień %f na liczbę całkowitą, a otrzymasz niepotrzebne dane lub awarię programu.
Dlaczego scanf nie wystarczy
Możesz połączyć wywołanie scanf, aby odczytać wiele wartości.
Działa to w przypadku liczb. Jest wystarczająco czysto. Ale spróbować przeczytać cały wiersz tekstu? To nie zadziała. scanf ze specyfikatorem %s zatrzymuje się na pierwszym białym znaku. Nie czyta całej linii. I nie obsługuje bezpiecznie przepełnienia bufora.
W przypadku prawdziwych programów powinieneś unikać używania scanf do wprowadzania tekstu. Zamiast tego używaj polecenia „gets” (które jest przestarzałe i niebezpieczne) lub najlepiej „fgets”. Funkcje te wczytują wiersz po wierszu do bufora. Kiedy już masz ciąg znaków, możesz go przeanalizować. Możesz sprawdzić błędy. Zanim spróbujesz przekonwertować, możesz upewnić się, że dane wejściowe wyglądają jak liczba. scanf pomija ten krok. Zakłada, że wiesz, co robisz. Zwykle o tym nie wiesz.
Celowe zniszczenie
Najlepszym sposobem na naukę C nie jest czytanie dokumentacji. To jest błąd kompilatora.
Weź ten fragment:
Zmień to. Spraw, żeby było gorzej.
Usuń b z deklaracji zmiennych. Zobacz, jak kompilator zaczyna krzyczeć na temat niezdefiniowanej zmiennej.
Usuń średnik. Zobacz, jak propaguje się błąd składniowy.
Usuń nawias klamrowy. Zobacz, jak parser szaleje.
Usuń nawias. Obserwuj zamieszanie






































