Hardkodowanie jest w porządku przy pierwszej próbie, ale prawdziwe oprogramowanie musi reagować na to, co wprowadzają użytkownicy. Oryginalny fragment kodu używał stałych. Był statyczny. Możliwy do przewidzenia. Nudny.

Aby program był użyteczny, musi otrzymywać dane wejściowe od użytkownika podczas jego działania. Służy do tego funkcja „scanf”. Jest przeciwieństwem „printf”. Podczas gdy „printf” wyświetla dane na ekranie, „scanf” odczytuje je z klawiatury.

Poniżej pokazano, jak obsługiwać podstawowe wprowadzanie liczb całkowitych w C.

Przechwytywanie danych wprowadzanych przez użytkownika

Nie można po prostu zadeklarować zmiennej i oczekiwać, że w magiczny sposób zaakceptuje dane użytkownika. Musisz poprosić o te dane. Musisz także poinformować komputer, gdzie te dane powinny być przechowywane. Dlatego scanf wymaga wskaźnika (znaku & ). Jeśli zapomnisz o dołączeniu znaku ampersand, program może ulec awarii lub zapisać śmieci w pamięci. Zawsze używaj go dla typów pierwotnych, takich jak „int”.

Rozważ zaktualizowaną logikę:

  1. Zadeklaruj zmienne do przechowywania danych wejściowych i wyniku.
  2. Wyświetl monit dla użytkownika, aby wiedział, co wpisać.
  3. Użyj scanf z poprawnym specyfikatorem formatu (%d dla liczb całkowitych).
  4. Wykonaj obliczenia, korzystając z zapisanych wartości.
  5. Wyprowadź wynik, włączając zmienne wejściowe do linii wyjściowej.

Dlaczego to jest ważne?

Przejście od stałych do zmiennych zmienia wszystko. Program nie powtarza się już jak zdarta płyta. Ona się dostosowuje. Można go uruchomić raz z numerami 5 i 7. Można go uruchomić ponownie z numerami 100 i 200. Logika pozostaje ta sama; zmiany danych.

Jest podstawą interaktywnych aplikacji wiersza poleceń (CLI). Zanim będziesz mógł zbudować złożone narzędzia, musisz zrozumieć, jak bezpiecznie przekształcać dane w zmienne.

Kluczowe wnioski

  • scanf wymaga wskaźnika: Zawsze używaj operatora adresu (& ) przed nazwą zmiennej w scanf.
  • Specyfikatory formatu muszą być zgodne: Jeśli czytasz int, musisz użyć %d. Użycie %f na liczbie całkowitej spowoduje niezdefiniowane zachowanie.
  • Podpowiedzi są krytyczne: Bez wyraźnego monitu, takiego jak „Wprowadź pierwszą wartość:”, użytkownik będzie wpatrywał się w migający kursor i zastanawiał się, czy program się zawiesił, czy nie. Nie zamarzło. Po prostu czeka na wejście.

Kod działa. To proste. Ale jest funkcjonalny. Przeszedłeś ze skryptu statycznego do narzędzia dynamicznego. Następnym krokiem jest zazwyczaj obsługa błędów. Co się stanie, jeśli użytkownik wprowadzi „cześć” zamiast liczby? scanf zakończy się niepowodzeniem w trybie cichym, pozostawiając zmienne niezainicjowane. To problem na inny dzień.

W międzyczasie masz program, który faktycznie słucha.

Dane wejściowe, wyjściowe i zasady interakcji

Dokonałeś zmian. Teraz skompiluj kod. Uruchom to. Jeśli program ulegnie awarii, nie panikuj. Najprawdopodobniej przeoczyłeś jakiś drobny szczegół składni.

Skorzystaj z funkcji „scanf”. Używa ciągów formatujących podobnych do printf. Jeśli potrzebujesz szczegółowej dokumentacji, wpisz „man scanf”. Ale zwróć uwagę na ampersand (& ) przed zmiennymi takimi jak a i b.

To jest operator adresu.

Zwraca adres pamięci zmiennej. Teraz może się to wydawać mylące. Wskaźniki wyjaśnią tę kwestię później. Ale na razie postępuj zgodnie z zasadą: jeśli używasz scanf dla char, int lub float, potrzebujesz &. Jest to również wymagane w przypadku konstrukcji.

Pominąć &? Otrzymasz błąd wykonania. Świadomie łam tę zasadę. Zobacz, co się stanie. Tylko w ten sposób przypomnisz sobie, dlaczego jest to ważne.

Precyzyjne formatowanie wyjściowe

Spójrzmy na printf. Zacznijmy od czegoś prostego.

printf("Witam");

To polecenie wysyła słowo „Hello” na standardowe wyjście. Nic więcej. Brak podawania linii. Kursor pozostaje bezpośrednio po literze „o”.

Teraz dodajmy nowy wiersz.

printf("Witam\n");

\n powoduje powrót karetki. Dane wyjściowe kończą się w osobnej linii. Jest to standardowe oczekiwanie w przypadku czystego wyjścia konsolowego.

Zmienne wymagają symboli zastępczych. Aby wydrukować wartość b :

printf("%d", b);

%d jest symbolem zastępczym. Kiedy kod jest wykonywany, printf zastępuje go rzeczywistą wartością całkowitą b.

Możesz osadzać znaczenia w zdaniach. Możesz używać wielu połączeń z rzędu:

printf("Temperatura wynosi "); printf("%d", b); printf("stopnie\n");

Ale to męczące. Bardziej przejrzystym podejściem jest połączenie ich w jeden ciąg formatujący:

printf("Temperatura wynosi %d stopni\n", b);

Można także wyświetlić wiele wartości.

printf("%d + %d = %d\n", a, b, c);

Jest tu pułapka. Liczba symboli zastępczych w ciągu formatującym musi dokładnie odpowiadać liczbie następujących po nim zmiennych. Dokładnie.

Jeśli masz trzy znaczniki %d, potrzebujesz trzech parametrów. Typy muszą się zgadzać. Kolejność musi się zgadzać. Złamiesz te zasady? Dane wyjściowe będą śmieciami. Albo, co gorsza, program ulegnie awarii.

Dopasowywanie typów do symboli zastępczych

printf obsługuje większość standardowych typów C. Wystarczy użyć prawidłowego kodu.

  • int używa %d
  • float używa %f
  • char używa %c
  • ciągi znaków używają %s

Aby uzyskać głębsze zrozumienie, sprawdź man 3 printf w systemie UNIX. Twój konkretny kompilator najprawdopodobniej ma podręcznik lub plik pomocy obejmujący przypadki Edge.

Typowe błędy

Nowicjusze cały czas potykają się o te punkty.

Wielkość liter jest rygorystyczna. „printf” jest pisane małymi literami. Printf lub PRINTF spowoduje błąd.

scanf wymaga operatora adresu (& ). Zapomnij o tym, a program nie zapisze poprawnie wprowadzonych danych.

Liczba parametrów ma znaczenie. Zbyt wiele lub zbyt mało argumentów w printf lub scanf powoduje niezdefiniowane zachowanie.

Deklaracja musi poprzedzać użycie. Nie można użyć nazwy zmiennej w C bez jej uprzedniego zadeklarowania. Kompilator musi wcześniej znać strukturę pamięci i jej typ.

Kompilator nie ma pojęcia. Wymaga ścisłego przestrzegania zasad.