Popis funkce Scanf C
Popis funkce Scanf C

Video: Popis funkce Scanf C

Video: Popis funkce Scanf C
Video: MOST VALUABLE RARE JAPAN coins of value - numismatics 2024, Smět
Anonim

V tomto článku je funkce scanf() uvažována v obecné podobě bez odkazu na konkrétní standard, takže jsou zde zahrnuta data ze všech standardů C99, C11, C++11, C++14. Možná, že v některých normách funkce funguje s odlišnostmi od materiálu uvedeného v článku.

funkce scanf C – popis

scanf() je funkce umístěná v hlavičkových souborech stdio.h(C) a cstdio(C++), známá také jako formátovaný vstup programu. scanf čte znaky ze standardního vstupního toku (stdin) a převádí je podle formátu, poté je zapisuje do zadaných proměnných. Formát - znamená, že data jsou po přijetí převedena do určité podoby. Funkce scanf C je tedy popsána:

scanf("%formát", &variable1[, &variable2, […]), kde se proměnné předávají jako adresy. Důvod tohoto způsobu předávání proměnných do funkce je zřejmý: v důsledku práce vrací hodnotu indikující přítomnost chyb, tzn.jediný způsob, jak změnit hodnoty proměnných, je předávání adresy. Také díky této metodě může funkce zpracovávat data libovolného typu.

Někteří programátoři označují funkce jako scanf() nebo printf() jako procedury z důvodu analogie s jinými jazyky.

Scanf umožňuje zadávání všech základních typů jazyků: char, int, float, string atd. V případě proměnných typu string není potřeba uvádět znak adresy - "&", protože proměnná typu string je pole a její název je adresa prvního prvku pole v paměti počítače..

Použití C v C++
Použití C v C++

Formát zadávání dat nebo kontrolní řetězec

Začněte tím, že se podíváte na příklad funkce scanf C z popisu.


include int main() { int x; while (scanf("%d", &x)==1) printf("%d\n", x); návrat 0; //požadavek na linuxové systémy }

Vstupní formát se skládá z následujících čtyř parametrů: %[width][modifikátory] typ. V tomto případě je znak "%" a typ povinnými parametry. To znamená, že minimální formát vypadá takto: „%s“, „%d“atd.

Obecně se znaky, které tvoří formátovací řetězec, dělí na:

  • specifikátory formátu – cokoliv začínající %;
  • oddělovací nebo mezerové znaky – jsou to mezera, tabulátor(t), nový řádek (n);
  • znaky jiné než mezery.

Funkce nemusí být bezpečná.

Použijte scanf_s() místo scanf().

(zpráva z Visual Studia)

Zadejte nebo formátujte specifikátory nebo převodní znaky nebo řídicí znaky

binární kód
binární kód

Deklarace scanf C musí obsahovat alespoň specifikátor formátu, který je uveden na konci výrazů začínajících "%". Sděluje programu, jaký typ dat má při zadávání očekávat, obvykle z klávesnice. Seznam všech specifikátorů formátu v tabulce níže.

Typ Význam
1 %c Program čeká na zadání znaku. Proměnná, která má být zapsána, musí být znakového typu char.
2 %d Program očekává zadání desítkového čísla typu celé číslo. Proměnná musí být typu int.
3 %i Program očekává zadání desítkového čísla typu celé číslo. Proměnná musí být typu int.
4 %e, %E Program očekává zadání čísla s plovoucí desetinnou čárkou (čárkou) v exponenciální podobě. Proměnná musí být typu float.
5 %f Program očekává číslo s plovoucí desetinnou čárkou (čárkou). Proměnná musí být typu float.
6 %g, %G Program očekává číslo s plovoucí desetinnou čárkou (čárkou). Proměnná musí být typu float.
7 %a Program očekává číslo s plovoucí desetinnou čárkou (čárkou). Proměnná musí být typu float.
8 %o Program očekává osmičkové číslo. Proměnná musí být typu int.
9 %s

Program čeká na zadání řetězce. Řetězec je sada libovolných znaků až do prvního nalezeného oddělovacího znaku. Proměnná musí být typu string.

10 %x, %X Program čeká na šestnáctkové číslo. Proměnná musí být typu int.
11 %p Proměnná očekává vstup ukazatele. Proměnná musí být typu ukazatel.
12 %n Zapíše do proměnné celočíselnou hodnotu rovnající se počtu znaků, které dosud přečetla funkce scanf.
13 %u Program čte celé číslo bez znaménka. Typ proměnné musí být celé číslo bez znaménka.
14 %b Program čeká na binární číslo. Proměnná musí být typu int.
15 % Naskenovaná znaková sada. Program čeká na zadání znaků.z omezeného fondu uvedeného v hranatých závorkách. scanf bude fungovat, pokud budou ve vstupním proudu znaky ze zadané sady.
16 %% Podepište "%".

Znaky ve formátovacím řetězci

C++ kód
C++ kód

Symbol hvězdičky ()

Hvězdička () je příznak indikující, že operace přiřazení by měla být potlačena. Bezprostředně za znakem "%" je umístěna hvězdička. Například


scanf("%d%c%d", &x, &y); //ignoruje znak mezi dvěma celými čísly. scanf("%s%d%s", str, str2); //ignoruje celé číslo mezi dvěma řetězci.

To znamená, že pokud do konzole zadáte řádek „45-20“, program provede následující:

  1. Proměnné "x" bude přiřazena hodnota 45.
  2. Proměnné "y" bude přiřazena hodnota 20.
  3. A znaménko mínus (pomlčka) "-" bude ignorováno díky "%c".

Šířka (nebo šířka pole)

Toto je celé číslo mezi znaménkem "%" a specifikátorem formátu, které určuje maximální počet znaků ke čtení v aktuální operaci čtení.


scanf("%20s", str); //přečte prvních 20 znaků ze vstupního proudu

Je třeba mít na paměti několik důležitých věcí:

  1. scanf se ukončí, pokud narazí na oddělovací znak, i když nepočítal 20 znaků.
  2. Pokud zadáte více než 20 znaků, do str. se zapíše pouze prvních 20 znaků

Modifikátorytyp (nebo přesnost)

úvodní kód
úvodní kód

Toto jsou speciální příznaky, které upravují typ dat očekávaných pro vstup. Příznak je uveden vlevo od specifikátoru typu:

  • L nebo l (malé L) Když je použito "l" se specifikátory d, i, o, u, x, příznak sděluje programu, že se očekává vstup typu long int. Při použití "l" se specifikátorem e nebo f příznak říká programu, že by měl očekávat dvojnásobnou hodnotu. Použití "L" říká programu, že se očekává dlouhý double. Použití "l" se specifikátory "c" a "s" říká programu, že jsou očekávány dvoubajtové znaky jako wchar_t. Například „%lc“, „%ls“, „%l[asd]“.
  • h je příznak označující krátký typ.
  • hh – označuje, že proměnná je ukazatel na hodnotu znaku se znaménkem nebo znak bez znaménka. Příznak lze použít se specifikátory d, i, o, u, x, n.
  • ll (dvě malá L) – označuje, že proměnná je ukazatel na hodnotu typu sign long long int nebo unsigned long long int. Příznak se používá se specifikátory: d, i, o, u, x, n.
  • j - označuje, že proměnná je ukazatel na typ intmax_t nebo uintmax_t z hlavičkového souboru stdint.h. Používá se se specifikátory: d, i, o, u, x, n.
  • z - označuje, že proměnná je ukazatel na typ size_t, jehož definice je v stddef.h. Používá se se specifikátory: d, i, o, u, x, n.
  • t - označuje, že proměnná je ukazatel na typ ptrdiff_t. Definice zapnutátento typ je v stddef.h. Používá se se specifikátory: d, i, o, u, x, n.

Srozumitelněji lze obrázek s modifikátory reprezentovat jako tabulku. Takový popis scanf C pro programátory bude srozumitelnější.

Specifikátory a modifikátory typu
Specifikátory a modifikátory typu

Další znaky

Všechny znaky nalezené ve formátu budou vyřazeny. Zároveň je třeba poznamenat, že přítomnost mezer nebo oddělovacích znaků (nový řádek, mezera, tabulátor) v řídicím řetězci může vést k odlišnému chování funkce. V jedné verzi bude scanf() číst bez uložení jakéhokoli počtu oddělovačů, dokud nenarazí na jiný znak než oddělovač, a v jiné verzi nehrají mezery (pouze ony) roli a výraz "%d + %d" je ekvivalentní "% d+%d".

Příklad kódu C++
Příklad kódu C++

Příklady

Pojďme se podívat na několik příkladů, které vám pomohou přemýšlet a lépe porozumět tomu, jak funkce funguje.


scanf("%3s", str); //pokud do konzole zadáte řetězec "1d2s3d1;3", do str scanf("%dminus%d", &x, &y) se zapíše pouze "1d2"); //minusové znaky mezi dvěma čísly budou zahozeny scanf("%5[0-9]", str); // znaky budou zadávány do str, dokud nebude 5 znaků a znaky budou čísla od 0 do 9. scanf("%lf", &d); //očekáváme dvojitý vstup scanf("%hd", &x); //očekávané číslo typu short scanf("%hu", &y); //očekáváme číslo bez znaménka short scanf("lx", &z); //očekávané číslo typu long int

OdNíže uvedené příklady ukazují, jak se očekávané číslo mění pomocí různých symbolů.

scanf C – popis pro začátečníky

Tato sekce bude užitečná pro začátečníky. Často potřebujete mít po ruce ani ne tak úplný popis scanf C jako podrobnosti o tom, jak funkce funguje.

  • Tato funkce je poněkud zastaralá. Existuje několik různých implementací v knihovnách různých verzí. Například vylepšená funkce scanf S C, jejíž popis najdete na webu microsoftu.
  • Počet specifikátorů ve formátu musí odpovídat počtu argumentů předávaných funkci.
  • Prvky vstupního proudu musí být odděleny pouze oddělovacími znaky: mezera, tabulátor, nový řádek. Čárka, středník, tečka atd. – tyto znaky nejsou oddělovače pro funkci scanf().
  • Pokud scanf narazí na oddělovací znak, vstup se zastaví. Pokud existuje více než jedna proměnná ke čtení, pak scanf přejde na čtení další proměnné.
  • Sebemenší nekonzistence ve formátu vstupních dat vede k nepředvídatelným výsledkům programu. No, pokud program právě skončí s chybou. Ale často program pokračuje v práci a dělá to špatně.
  • scanf("%20s …", …); Pokud vstupní tok překročí 20 znaků, pak scanf přečte prvních 20 znaků a buď přeruší, nebo přejde na čtení další proměnné, pokud je zadána. V tomto případě bude další volání scanf pokračovat ve čtení vstupního toku od bodu, kde se práce předchozího volání scanf zastavila. Pokud při čtení prvních 20znaků, je nalezen oddělovací znak, scanf přeruší nebo bude pokračovat ve čtení další proměnné, i když nenačetl 20 znaků pro první proměnnou. V tomto případě budou všechny nepřečtené znaky připojeny k další proměnné.
  • Pokud sada naskenovaných znaků začíná „^“, pak scanf bude číst data, dokud nenarazí na oddělovací znak nebo znak ze sady. Například „%[^A-E1-5]“bude číst data ze streamu, dokud nenarazí na jeden z velkých anglických znaků od A do E nebo jedno z čísel od 1 do 5.
  • Funkce scanf C, jak je popsána, vrací číslo rovné počtu úspěšných zápisů do proměnných. Pokud scanf zapíše 3 proměnné, pak úspěšný výsledek funkce vrátí číslo 3. Pokud scanf nemohl zapsat žádné proměnné, pak výsledek bude 0. A konečně, pokud se scanf z nějakého důvodu vůbec nespustí, výsledkem bude EOF.
  • Pokud funkce scanf() skončila nesprávně. Například scanf("%d", &x) - bylo očekáváno číslo, ale jako vstup byly přijaty znaky. Další volání scanf() začne v bodě vstupního proudu, kde skončilo předchozí volání funkce. K překonání tohoto problému je nutné zbavit se problémových postav. To lze provést například voláním scanf("%s"). To znamená, že funkce přečte řetězec znaků a zahodí jej. Tímto ošemetným způsobem můžete pokračovat v zadávání potřebných údajů.
  • V některých implementacích scanf() není "-" v naskenované znakové sadě povoleno.
  • Specifikátor "%c" čte každý znak ze streamu. To znamená, že také přečte znak oddělovače. Chcete-li přeskočit oddělovací znak a pokračovat ve čtení požadovaného znaku, můžete použít "%1s".
  • Při použití specifikátoru "c" je přípustné použít šířku "%10c", ale pak musí být pole prvků typu char předáno jako proměnná funkci scanf.
  • „%[a-z]“znamená „všechna malá písmena anglické abecedy“a „%[z-a]“znamená pouze 3 znaky: „z“, „a“, „-“. Jinými slovy, znak "-" znamená rozsah pouze v případě, že je mezi dvěma znaky, které jsou ve správném pořadí. Pokud je „-“na konci výrazu, na začátku nebo ve špatném pořadí znaků na obou jeho stranách, pak je to pouze znak pomlčky, nikoli rozsah.
C++ kód
C++ kód

Závěr

Tímto končí popis scanf C. Toto je pěkná užitečná funkce pro práci v malých programech a při použití metody procedurálního programování. Hlavní nevýhodou je však množství nepředvídatelných chyb, které mohou při použití scanf nastat. Proto je nejlepší mít popis scanf C při programování na očích. Ve velkých profesionálních projektech se využívají iostreamy, a to díky tomu, že mají možnosti vyšší úrovně, dokážou lépe zachytit a zpracovat chyby a také pracovat s významným množstvím informací. Je třeba také poznamenat, že popis scanf C v ruštině je k dispozici na mnoha síťových zdrojích, stejně jako jeho příkladypoužití, vzhledem ke stáří funkce. Proto v případě potřeby vždy najdete odpověď na tematických fórech.

Doporučuje: