Stałe się nie zmieniają. Są niezmienne. Życie działa inaczej, a programy testowe również nie powinny być statyczne. Jeśli uczysz się C, zakodowane na stałe liczby, takie jak 5 i 7, szybko się nudzą. Potrzebujesz interakcji. Chcesz, żeby komputer czekał, aż coś napiszesz.
Pojawia się „scanf”.
To jest druga część historii zaczynającej się od printf. Podczas gdy „printf” wyświetla dane na ekranie, „scanf” odczytuje dane z klawiatury. Nie jest to najsolidniejsze narzędzie w standardowej bibliotece C, ale w przypadku prostych danych wejściowych z konsoli wykonuje swoje zadanie bez konieczności uwzględniania zależności stron trzecich.
Oto jak zamienić statyczny skrypt w program dynamiczny.
Kod
Skopiuj to. Uruchom to. Wprowadź liczby, gdy program o to poprosi.
Analizowanie scanf
Magia dzieje się w tych dwóch linijkach:
scanf("%d", &a);
scanf: Nazwa funkcji. Skrót oznaczający dane wejściowe w formacie skanowania."%d": Specyfikator formatu. Mówi „scanf”, aby oczekiwał liczby całkowitej. Jeśli czytałeś liczbę zmiennoprzecinkową, użyłbyś"%f".&a: To jest najważniejsza część. Nie przekazujesz wartości do zmienneja. Podajesz adres zmienneja.
Pomyśl o tym w ten sposób: „printf” musi wiedzieć, co znajduje się wewnątrz zmiennej. scanf musi wiedzieć gdzie umieścić dane. Operator & udostępnia ten adres w pamięci. Jeśli przegapisz znak ampersand, program ulegnie awarii. Albo, co gorsza, otrzymasz ostrzeżenie, które wygląda jak nonsens i zmienną, która się nie zmieni.
Jak to działa w praktyce
Po uruchomieniu programu:
- Terminal wyświetla komunikat:
Wpisz pierwszą wartość: - Kursor miga. Program czeka. Pozostajesz w tym stanie, dopóki czegoś nie wpiszesz i nie naciśniesz Enter.
- Wpisz „5”. Naciśnij Enter.
scanfpobiera tę wartość5, konwertuje ciąg znaków „5” na wartość całkowitą 5 i zapisuje ją pod adresem pamięci&a.- Ten sam cykl następuje dla drugiej wartości.
Następnie wykonywana jest operacja matematyczna. c = a + b;. Prosty dodatek.
Na koniec printf wypisuje wynik. Zwróć uwagę na linię formatu: printf("%d + %d = %d\n", a, b, c);. Podstawiasz zmienne z powrotem do ciągu. W ten sposób powstaje jasny wniosek.
Dlaczego to jest ważne?
Większość nowoczesnych aplikacji nie korzysta z danych wejściowych z konsoli. Nie wpisujesz poleceń w czarnym oknie przeglądarki internetowej lub edytora zdjęć. Jednak zrozumienie tego przepływu ma fundamentalne znaczenie.
Wejście -> Przetwarzanie -> Wyjście.
Jest to podstawowy cykl każdego oprogramowania.
Jak scanf obsługuje adresy pamięci
Po uruchomieniu tego kodu różnica między sukcesem a awarią jest określana przez jeden znak. Mianowicie ampersand („&”) przed zmiennymi „a” i „b”.
To jest operator adresu. Mówi „scanf” dokładnie, gdzie w pamięci powinny zostać zapisane odebrane dane wejściowe. Bez tego scanf nie zna położenia zmiennej. Otrzymuje jedynie wartość, która jest bezużyteczna do zapisania danych z powrotem do programu. Jeśli pominiesz tę instrukcję, program nie skompiluje się lub ulegnie awarii natychmiast po uruchomieniu. Ten operator jest wymagany dla typów char, int, float i struct.
Spróbuj go usunąć. Zobacz, co się stanie. To bolesna, ale konieczna lekcja na temat tego, jak C zarządza pamięcią.
Mastering wyników przy użyciu printf
printf to okno interakcji użytkownika. Wysyła dane na standardowe wyjście. Najprostsza wersja jest niezwykle przejrzysta.
Spowoduje to wydrukowanie słowa Hello. Nic więcej. Brak podawania linii. Kursor pozostaje bezpośrednio po literze „o”.
Dodaj znak nowej linii.
Dane wyjściowe zostaną teraz przeniesione do następnej linii. \n to znak powrotu karetki. Jest wymagany, aby dane wyjściowe konsoli były czytelne.
Zmienne zmieniają zasady gry. Nie można po prostu wydrukować nazwy zmiennej, tak jak w Pythonie lub JavaScript. Musisz użyć symbolu zastępczego.
%d jest symbolem zastępczym. Zastępuje się ją całkowitą wartością zmiennej „b” w czasie wykonywania. W ten sposób C obsługuje dynamiczne wyjście.
Możesz mieszać tekst i zmienne. Jednym z niezdarnych sposobów jest łączenie wielu wywołań drukowania.
To działa. Ale jest to również kłopotliwe. Bardziej przejrzystym podejściem jest umieszczenie wszystkiego w jednej linii.
Wiele wartości również działa. Upewnij się tylko, że symbole zastępcze odpowiadają argumentom w odpowiedniej kolejności.
Porządek ma znaczenie. Pierwsze %d pasuje do a. Drugie to „b”. Trzeci to „c”. Jeśli je zamienisz, obliczenia będą błędne. Jeżeli któryś pominiesz, zachowanie programu będzie niezdefiniowane. Liczba i typy specyfikatorów w ciągu formatującym muszą dokładnie odpowiadać parametrom.
Wypełniacze specyficzne dla typu
C rygorystycznie podchodzi do typów danych. Nie możesz używać tego samego symbolu zastępczego do wszystkiego. Należy dopasować typ danych do specyfikatora formatu.
- Użyj %d dla int (wartości całkowite).
- Użyj %f dla float (liczby zmiennoprzecinkowe).
- Użyj %c dla znaku (pojedyncze znaki).
- Użyj %s dla ciągów znaków (tablic znaków).
Jeśli użyjesz %d jako float, otrzymasz bezsensowne wyjście. Jeśli użyjesz %s jako int, program najprawdopodobniej ulegnie awarii. Dokładność nie jest tutaj opcjonalna.
Więcej informacji na temat tych specyfikatorów można znaleźć w materiałach referencyjnych systemu UNIX. Wprowadź polecenie „man 3 printf”. Inne kompilatory udostępniają podobną dokumentację. Warto przeczytać.
Typowe błędy, których należy unikać
Kompilatory C są przydatne, ale nie czytają w myślach. Będziesz popełniać błędy. Oto, jak uniknąć tych najczęstszych.
- Uwzględnianie wielkości liter : C uwzględnia wielkość liter.
PrintflubPRINTFspowoduje błąd. Poprawna pisownia to „printf”. To samo dotyczy nazw zmiennych i wywołań funkcji. - Brak operatora adresu : Zapomnienie o umieszczeniu
&wscanfjest częstym błędem. Powoduje to natychmiastową awarię w czasie wykonywania. Zawsze określaj to dla typów pierwotnych. - Niezgodność parametrów : Zbyt wiele lub zbyt mało argumentów w
printflubscanfpowoduje błędy. Ciąg formatujący definiuje strukturę. Podążaj za tym. - Niezadeklarowane zmienne : Musisz zadeklarować zmienną przed jej użyciem. C nie wnioskuje automatycznie typów. Definiujesz
int a;zanim będziesz mógł wydrukowaća.
Te błędy się powtarzają. Ale łatwo je poprawić, gdy rozpoznasz wzór.





























