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

12

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 zmiennej a. Podajesz adres zmiennej a.

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:

  1. Terminal wyświetla komunikat: Wpisz pierwszą wartość:
  2. Kursor miga. Program czeka. Pozostajesz w tym stanie, dopóki czegoś nie wpiszesz i nie naciśniesz Enter.
  3. Wpisz „5”. Naciśnij Enter.
  4. scanf pobiera tę wartość 5, konwertuje ciąg znaków „5” na wartość całkowitą 5 i zapisuje ją pod adresem pamięci &a.
  5. 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.

  1. Uwzględnianie wielkości liter : C uwzględnia wielkość liter. Printf lub PRINTF spowoduje błąd. Poprawna pisownia to „printf”. To samo dotyczy nazw zmiennych i wywołań funkcji.
  2. Brak operatora adresu : Zapomnienie o umieszczeniu & w scanf jest częstym błędem. Powoduje to natychmiastową awarię w czasie wykonywania. Zawsze określaj to dla typów pierwotnych.
  3. Niezgodność parametrów : Zbyt wiele lub zbyt mało argumentów w printf lub scanf powoduje błędy. Ciąg formatujący definiuje strukturę. Podążaj za tym.
  4. 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.