Jak číst uživatelský vstup v C pomocí scanf

13

Konstanty jsou pohodlné. Jsou statické. Ale jsou také nudné.

Program, který vždy sčítá 5 a 7, dělá přesně jednu věc. Nepřizpůsobuje se. Neinteraguje. Aby byl kód C skutečně užitečný pro koncové uživatele, musíte přestat tvrdě nabíjet hodnoty a začít poslouchat.

Nástroj pro tento úkol je scanf.

Od pevně kódovaného k dynamickému

V předchozím příkladu byly proměnné a a b pravděpodobně inicializovány na pevná čísla. Logika byla tvrdá. Závěr byl předvídatelný. Pokud jste chtěli dodatek změnit, museli jste upravit zdrojový kód, překompilovat jej a znovu spustit.

To je pro uživatele nepohodlné.

Abychom to napravili, musíme zachytit vstup z konzole. Standardní knihovna zpracovává výstup (printf ) i vstup (scanf ). Přechod z konstant na uživatelem definované hodnoty transformuje program z ukázky kalkulačky na jednoduchý nástroj.

syntaxe scanf

Zde je kód, který to implementuje:

Logika je jednoduchá. Je lineární.

  1. Program se zeptá na první celé číslo.
  2. scanf čeká na vstup.
  3. Uživatel zadá číslo a stiskne Enter.
  4. Hodnota je uložena v “a”.
  5. Opakováno pro „b“.
  6. Složí je.
  7. Zobrazí výsledek.

Ampersand (&) zmatek

Nejčastějším bodem selhání začátečníků je zde znak &.

Podívejte se na tento řádek:
scanf("%d", &a);

Proč je zde ampersand? Proč ne jen scanf("%d", a);?

Proměnné v C nejsou jen názvy. Toto jsou adresy paměti. Když deklarujete int a, rezervujete si část paměti RAM. scanf nechce hodnotu a, protože a je aktuálně prázdné (nebo obsahuje odpadky). scanf potřebuje adresu, na kterou může zapsat novou hodnotu.

& je operátor “proměnné adresy”. Předá scanf umístění v paměti, aby mohl přímo upravit a. Bez něj ukážete scanf na náhodnou část paměti. Program s největší pravděpodobností spadne, nebo v horším případě poškodí vaše data.

Klíčová myšlenka: printf používá hodnotu. scanf potřebuje adresu.

Specifikátory formátu

Použili jste %d v printf k zobrazení celého čísla. K přečtení musíte použít %d v scanf.

Neshoda těchto specifikátorů má za následek nedefinované chování. Pokud se pokusíte přečíst celé číslo pomocí %f (číslo s plovoucí desetinnou čárkou), data budou interpretována nesprávně. Struktura paměti čísla s plovoucí desetinnou čárkou se liší od struktury celého čísla. scanf zapíše nezpracované bity čísla s plovoucí desetinnou čárkou

Jak scanf a printf zpracovávají proměnné v C

Kompilace a spouštění kódu je místo, kde se teorie setkává s realitou. Pokud tento krok přeskočíte, jen hádáte. Funkce scanf funguje podobně jako printf, pokud jde o formátovací řetězce, ale má přísnější vstupní požadavky. Proměnným typu char, int, float a struktur musí předcházet operátor adresy (& ). Bez něj program spadne.

Proč scanf vyžaduje operátora adresy

Znak ampersand není volitelný. Instruuje kompilátor, aby uložil vstup přímo na adresu paměti proměnné. Pokud je vynechán, dojde k chybě běhu. Zkuste to záměrně odstranit. Sledování pádu programu je poučnější než čtení o něm. To jasně ukazuje, jak křehké může být C, pokud nezpracovává adresy paměti správně.

Jak printf formátuje výstup pro uživatele

printf odešle text na standardní výstup. Nejjednodušší verze vypadá takto:

Vypíše slovo “Ahoj” bez nového řádku. Porovnejte to s:

\n přidá znak nového řádku. Ukončí aktuální řádek. Bez něj se další výstup objeví na stejném řádku. Jedná se o malý detail, který v případě ignorování snižuje čitelnost.

Jak vložit proměnné do řádků printf

K zobrazení hodnoty proměnné se používá zástupný symbol. Specifikátor %d se nahradí hodnotou celočíselné proměnné. Podívejme se na příklad:

Je možné použít postupná volání printf ke smíchání textu a proměnných, ale to je neefektivní:

Čistším přístupem je vložit zástupný symbol přímo do řetězce:

Můžete také použít více zástupných symbolů:

Počet zástupných symbolů musí přesně odpovídat počtu proměnných. Druhy se také musí shodovat. Tři specifikátory %d vyžadují tři parametry int uvedené ve stejném pořadí. Nesoulad v typech nebo počtu parametrů má za následek nedefinované chování.

Které agregáty zpracovávají různé typy C

printf podporuje standardní typy C pomocí určitých specifikátorů formátu:

  • int používá %d
  • float používá %f
  • char používá %c
  • řetězce znaků používají %s

Podrobnou dokumentaci lze nalézt spuštěním man 3 printf na stroji UNIX. Jiné kompilátory poskytují podobné manuálové stránky nebo soubory nápovědy.

Běžné chyby C, kterým je třeba se vyhnout

Případ postavy je přísný. Printf nebo PRINTF způsobí chybu. Funkce musí být napsána malými písmeny: printf.

  • Zapomenuté & v scanf způsobí pád během provádění.
  • Neshoda v počtu parametrů v printf nebo scanf vede ke zkomolenému výstupu.
  • Použití nedeklarovaných proměnných způsobuje chyby při kompilaci.

Ladění těchto problémů často spočívá nejprve v kontrole syntaxe. Kompilátor obvykle přesně označí, kde je neshoda. Jediné, co musíte udělat, je přečíst si chybovou zprávu.