Jak odczytać dane wprowadzone przez użytkownika w C za pomocą scanf

11

Stałe są wygodne. Są statyczne. Ale są też nudne.

Program, który zawsze dodaje 5 i 7, robi dokładnie jedną rzecz. Ona się nie dostosowuje. Ona nie wchodzi w interakcję. Aby kod C był naprawdę przydatny dla użytkowników końcowych, musisz przestać narzucać wartości i zacząć słuchać.

Narzędziem do tego zadania jest scanf.

Od zakodowanego na stałe do dynamicznego

W poprzednim przykładzie zmienne „a” i „b” zostały prawdopodobnie zainicjowane stałymi liczbami. Logika była trudna. Konkluzja była przewidywalna. Jeśli chciałeś zmienić dodatek, musiałeś edytować kod źródłowy, przekompilować go i uruchomić ponownie.

Jest to niewygodne dla użytkownika.

Aby to naprawić, musimy przechwycić dane wejściowe z konsoli. Standardowa biblioteka obsługuje zarówno dane wyjściowe (printf ), jak i wejściowe (scanf ). Przejście od stałych do wartości zdefiniowanych przez użytkownika przekształca program z wersji demonstracyjnej kalkulatora w proste narzędzie.

składnia scanf

Oto kod, który to implementuje:

Logika jest prosta. To jest liniowe.

  1. Program pyta o pierwszą liczbę całkowitą.
  2. scanf oczekuje na wejście.
  3. Użytkownik wprowadza numer i naciska Enter.
  4. Wartość jest przechowywana w a.
  5. Powtórzone dla „b”.
  6. Składa je.
  7. Wyświetla wynik.

Ampersand (&) zamieszanie

Najczęstszym punktem niepowodzenia dla początkujących jest znak „&”.

Spójrz na tę linię:
scanf("%d", &a);

Dlaczego jest tu znak ampersand? Dlaczego nie po prostu scanf("%d", a);?

Zmienne w C to nie tylko nazwy. To są adresy pamięci. Deklarując int a, rezerwujesz część pamięci RAM. scanf nie chce wartości a, ponieważ a jest obecnie puste (lub zawiera śmieci). scanf potrzebuje adresu, pod który może zapisać nową wartość.

& jest operatorem „adresu zmiennej”. Przekazuje polecenie „scanf” lokalizacji pamięci, aby móc bezpośrednio modyfikować „a”. Bez tego wskażesz polecenie „scanf” losowemu fragmentowi pamięci. Program najprawdopodobniej ulegnie awarii lub, co gorsza, uszkodzi Twoje dane.

Kluczowy pomysł: printf używa wartości. scanf potrzebuje adresu.

Specyfikatory formatu

Użyłeś %d w printf do wyświetlenia liczby całkowitej. Aby go odczytać, musisz użyć %d w scanf.

Niedopasowanie tych specyfikatorów powoduje niezdefiniowane zachowanie. Jeśli spróbujesz odczytać liczbę całkowitą za pomocą %f (liczby zmiennoprzecinkowej), dane zostaną nieprawidłowo zinterpretowane. Struktura pamięci liczby zmiennoprzecinkowej różni się od struktury pamięci liczby całkowitej. scanf zapisze surowe bity liczby zmiennoprzecinkowej

Jak scanf i printf obsługują zmienne w C

Kompilowanie i uruchamianie kodu to miejsce, w którym teoria spotyka się z rzeczywistością. Jeśli pominiesz ten krok, będziesz tylko zgadywać. Funkcja scanf działa podobnie do printf pod względem ciągów formatujących, ale ma bardziej rygorystyczne wymagania wejściowe. Zmienne typu char, int, float oraz struktury muszą być poprzedzone operatorem adresu (& ). Bez tego program się zawiesza.

Dlaczego scanf wymaga operatora adresu

Znak ampersandu nie jest opcjonalny. Nakazuje kompilatorowi przechowywanie danych wejściowych bezpośrednio pod adresem pamięci zmiennej. Jeżeli zostanie pominięty, wystąpi błąd wykonania. Spróbuj celowo go usunąć. Oglądanie awarii programu jest bardziej pouczające niż czytanie o tym. To wyraźnie pokazuje, jak kruchy może być C, jeśli nie obsługuje poprawnie adresów pamięci.

Jak printf formatuje dane wyjściowe dla użytkownika

printf wysyła tekst na standardowe wyjście. Najprostsza wersja wygląda następująco:

Wypisuje słowo „Hello” bez znaku nowej linii. Porównaj to z:

\n dodaje znak nowej linii. Kończy bieżącą linię. Bez tego następne wyjście pojawi się w tej samej linii. Jest to mały szczegół, który zmniejsza czytelność, jeśli zostanie zignorowany.

Jak osadzić zmienne w liniach printf

Aby wyświetlić wartość zmiennej, używany jest symbol zastępczy. Specyfikator %d zastępuje się wartością zmiennej całkowitej. Spójrzmy na przykład:

Można używać kolejnych wywołań printf w celu mieszania tekstu i zmiennych, ale jest to nieefektywne:

Bardziej przejrzystym podejściem jest osadzenie symbolu zastępczego bezpośrednio w ciągu znaków:

Możesz także użyć wielu symboli zastępczych:

Liczba symboli zastępczych musi dokładnie odpowiadać liczbie zmiennych. Typy również muszą się zgadzać. Trzy specyfikatory %d wymagają trzech parametrów int, wymienionych w tej samej kolejności. Niezgodność typów lub liczby parametrów powoduje niezdefiniowane zachowanie.

Które agregaty przetwarzają różne typy C

printf obsługuje standardowe typy C przy użyciu określonych specyfikatorów formatu:

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

Szczegółową dokumentację można znaleźć uruchamiając man 3 printf na komputerze z systemem UNIX. Inne kompilatory udostępniają podobne strony podręcznika lub pliki pomocy.

Typowe błędy C, których należy unikać

Wielkość liter jest rygorystyczna. Printf lub PRINTF spowoduje błąd. Funkcja musi być napisana małymi literami: printf.

  • Zapomniane & w scanf powodują awarię podczas wykonywania.
  • Niezgodność w liczbie parametrów w printf lub scanf prowadzi do zniekształconych wyników.
  • Użycie niezadeklarowanych zmiennych powoduje błędy kompilacji.

Debugowanie tych problemów często sprowadza się do sprawdzenia najpierw składni. Kompilator zwykle wskaże dokładnie, gdzie występuje niezgodność. Wszystko, co musisz zrobić, to przeczytać komunikat o błędzie.