nisfarm.ru

Funkce Scanf C: popis

V tomto článku je funkce scanf (), je považován za obecně bez ohledu na konkrétní normy, takže zde zahrnuje údaje ze všech měřítek C99, C11, C ++ 11, C ++ 14. Možná, že v některých normách funguje funkce s odlišnostmi od materiálu uvedeného v článku.

Funkce Scanf C - popis

scanf () je funkce umístěná v hlavičkovém souboru stdio.h (C) a cstdio (C ++), nazývá se také formátovaným datovým vstupem do programu. scanf přečte znaky ze standardního vstupního proudu (stdin) a převede je podle formátu a zapíše je do zadaných proměnných. Formát - znamená, že údaje o přijetí jsou dány určitému typu. Tak je popsána funkce scanf C:

scanf ("% format", variable1 [, proměnná2, [hellip-]]),

kde proměnné jsou předávány jako adresy. Důvod tohoto způsobu přenášení proměnných na funkci je zřejmý: v důsledku práce vrátí hodnotu indikující chyby, takže jediný způsob, jak změnit hodnoty proměnných, je odeslat na adresu. Také díky této metodě může funkce zpracovávat data všech typů.

Někteří programátoři, kvůli analogii s jinými jazyky, volá funkce jako scanf () nebo printf (), postupy.

Scanf umožňuje zadat všechny základní jazykové typy: char, int, float, string, atd. V případě proměnných typového řetězce není třeba zadávat znakovou adresu - "", protože proměnná typu řetězec je pole a jeho jméno je adresa prvního prvku pole v paměti počítače.

Použití C v C ++

Formát vstupu dat nebo ovládací řádek

Začneme příkladem použití funkce scanf C z popisu.

#include int main () {int x-while (scanf ("% d" x) == 1) printf ("% d n", x) -return 0- // požadavek linux-systems}

Vstupní formát se skládá z následujících čtyř parametrů: typ

  • [šířka] [modifikátory]. Znak "%" a typ jsou povinné parametry. To znamená, že minimální formát vypadá takto: "% s", "% d" a tak dále.

    Obecně platí, že znaky, které tvoří formátovací řetězec, jsou rozděleny do následujících kategorií:

    • specifikátory formátu - vše, co začíná znakem%;
    • oddělovací nebo mezery - jsou to mezery, záložka ( t), nový řádek ( n);
    • znaky, které se liší od mezery.

    Funkce nemusí být bezpečné.

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

    (zpráva z Visual Studio)

    Specifikátory typu nebo formátu, konverzní znaky nebo řídicí znaky

    Binární kód

    Popis scan C musí obsahovat alespoň specifikátor formátu, který je uveden na konci výrazů začínajících znakem "%". Informuje program o typu dat, který lze očekávat při psaní, obvykle z klávesnice. Seznam všech specifikátorů formátu v tabulce níže.

    Ne.

    Typ

    Význam

    1

    % c

    Program čeká na zadání znaku. Proměnná pro psaní musí mít char char.




    2

    % d

    Program čeká na celé číslo desetinné číslo. Proměnná musí být typu int.

    3

    % i

    Program čeká na celé číslo desetinné číslo. Proměnná musí být typu int.

    4

    % e,% E

    Program očekává zadání čísla s plovoucí desetinnou čárkou v exponenciálním tvaru. Proměnná musí být typu float.

    5

    % f

    Program čeká na zadání čísla s plovoucí čárkou (čárkou). Proměnná musí být typu float.

    6.

    % g,% G

    Program čeká na zadání čísla s plovoucí čárkou (čárkou). Proměnná musí být typu float.

    7.

    % a

    Program čeká na zadání čísla s plovoucí čárkou (čárkou). Proměnná musí být typu float.

    8.

    % o

    Program čeká na osmičkové číslo. Proměnná musí být typu int.

    9.

    % s

    Program čeká na linku. Řetězec je sada znaků, které mají být vymezeny před prvním znakem. Proměnná musí být typu řetězce.

    10

    % x,% X

    Program čeká na hexadecimální číslo. Proměnná musí být typu int.

    11

    % p

    Proměnná čeká na zadání ukazatele. Proměnná musí mít typ ukazatele.

    12.

    % n

    Zapíše celočíselnou hodnotu proměnné, která se rovná počtu znaků skenovaných před aktuálním okamžikem pomocí funkce scanf.

    13. místo

    % u

    Program přečte celé číslo bez znaménka. Typ proměnné musí být celé číslo bez znaménka.

    14. místo

    % b

    Program očekává zadání binárního čísla. Proměnná musí být typu int.

    15

    % []

    Sada skenovaných znaků. Program čeká na zadání znaků z omezeného fondu specifikovaného mezi hranaté závorky. scanf bude pracovat tak dlouho, dokud budou existovat znaky ze zadané množiny na vstupním toku.

    16

    %%

    Znak "%".

    Znaky ve formátu řetězec

    C ++ kód

    Hvězdička (*) znak

    Hvězdička (*) je příznak označující, že operace přiřazení musí být potlačena. Hvězdička je umístěna bezprostředně za znaménkem "%". Například,

    scanf ("% d% * c% d", x, y) - // ignorovat znak mezi dvěma celými čísly scanf ("% s% * d% s", str, str2) - // ignorovat celé číslo mezi dvěma řádky.

    To znamená, že pokud zadejte "45-20" v konzole, program provede následující:

    1. Proměnná "x" bude nastavena na 45.
    2. Proměnná "y" bude nastavena na 20.
    3. A znaménko mínus (pomlčka) ";" bude ignorováno díky "% * c".

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

    Toto je celé číslo mezi znakem "%" a specifikátorem formátu, který určuje maximální počet znaků, které se mají číst pro aktuální operaci čtení.

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

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

    1. scanf přestane pracovat, pokud narazí na oddělovací znak, i když nepočítá 20 znaků.
    2. Pokud je zadáno více než 20 znaků, budou na proměnnou str. Zapsány pouze prvních 20 znaků.

    Modifikátory typu (nebo přesnosti)

    Kód spořiče obrazovky

    Jedná se o speciální příznaky, které mění typ dat, který se má zadat. Příznak je vlevo od typu specifikátoru:

    • L nebo l (malé L) Při použití «l» se specifikací d, i, o, u, x, příznak říká programu, která by měla vstoupit datový typ dlouhé int. Používáte-li "l" specifikátor e nebo f, příznak informuje program, že by měl počkat na dvojitou hodnotu. Použití funkce "L" říká programu, že se očekává dlouhá dvojnásobná hodnota. Použití «l» je kvalifikovaný «c» a «s» říká programu, že očekávaný double-byte charakter typu wchar_t. Například "% lc", "% ls", "% l [asd]".
    • h je příznak označující typ zkratu.
    • hh - označuje, že proměnná je ukazatel na hodnotu typu signed char nebo nepodepsaného znaku. Vlajka může být použita se specifikátory d, i, o, u, x, n.
    • ll (dva malé L) - označuje, že proměnná je ukazatel na hodnotu podepsaného typu dlouho dlouho 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 ze souboru hlavičky stdint.h. Používá se se specifikátory: d, i, o, u, x, n.
    • z - označuje, že proměnná je ukazatel typu size_t, jehož definice je v stddef.h. Používá se se specifikátory: d, i, o, u, x, n.
    • t znamená, že proměnná je ukazatel typu ptrdiff_t. Definice pro tento typ je v stddef.h. Používá se se specifikátory: d, i, o, u, x, n.

    Je zřejmé, že obraz s modifikátory může být zobrazen ve formě tabulky. Tento popis scanf C pro programátory bude jasnější.

    Specifikátory a modifikátory typu

    Další znaky

    Veškeré znaky, které budou splněny ve formátu, budou vyřazeny. Je třeba poznamenat, že přítomnost řídicí vedení nebo mezerami oddělující znak (nový řádek, prostor, tab) může vést k různým chováním funkce. V jedné verzi scanf () bude číst bez uložení libovolného počtu separátorů do té míry, dokud nenarazí jiné než oddělovač charakter, a v jiném provedení - mezery (když) nehrají roli, a výraz „% d +% d“ je ekvivalent k „% d +% d ".

    Ukázkový kód C ++

    Příklady

    Podívejme se na řadu příkladů, které nám umožňují promyslet a přesněji pochopit fungování funkce.

    scanf ( "% 3s", str) - // pokud napíšete do konzole linii «1d2s3d1-3» písemné pouze str «1D2» scanf ( "% dminus% d", x, y) - // znak «minus» mezi těmito dvěma čísly bude otbroshenyscanf ( „% 5 [0-9]“, str) - // vstupní znaky v ulici dojde tak dlouho, dokud nebudou 5, a symboly jsou čísla z 0 až 9.scanf ("% lf", d) - // očekává se zadání dat typu doublescanf ("% hd", x) - // očekávejte počet typů shortscanf ("% hu", y) - // očekávejte počet typů bez znaménka shortscanf ("lx", z) - // očekávejte počet typů dlouhých int

    Z uvedených příkladů můžete vidět, jak se očekávané číslo mění s použitím různých symbolů.

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

    Tato část bude užitečná pro začátečníky. Často musíte mít po ruce ne tak úplný popis scanf C, jako podrobnosti o funkci.

    • Funkce je poněkud zastaralá. Existuje několik různých implementací v knihovnách různých verzí. Například funkce advanced scanf S C, jejíž popis lze nalézt na webové stránce společnosti Microsoft.
    • Počet specifikátorů ve formátu musí odpovídat počtu argumentů předaných funkci.
    • Prvky vstupního toku by měly být odděleny pouze oddělenými symboly: mezerou, kartou, novým řádkem. Čárka, středník, období atd. - tyto znaky nejsou pro funkci scanf () oddělitelné.
    • Pokud scanf narazí na oddělovací znak, vstup se zastaví. Pokud existuje více proměnných pro čtení, pak scanf bude pokračovat v čtení další proměnné.
    • Nejmenší nesoulad ve formátu vstupních údajů vede k nepředvídatelným výsledkům programu. No, pokud program končí jen s chybou. Program často pokračuje a funguje to nesprávně.
    • scanf ("% 20s hellip- ", hellip -) - Pokud vstupní proud překročí 20 znaků, potom scanf přečte prvních 20 znaků a buď přestane pracovat, nebo přečte další proměnnou, pokud je zadána. Další volání scanf bude pokračovat ve čtení vstupního proudu, odkud byl zastaven předchozí scanf hovor. Při čtení prvních 20 znaků bude uvítán separátorů, scanf své práci, nebo jít číst další proměnné, i když nejsou považovány za prvních 20 znaků v proměnné. V tomto případě budou všechny nepřečtené symboly připojeny k další proměnné.
    • Pokud sada skenovaných znaků začíná znakem "^", potom scanf bude číst data, dokud nenalezne oddělovací znak nebo znak ze sady. Například, „% [^ A-E1-5]“ číst z proudu do jednoho z znaky anglické abecedy budou pokryty z A až E v velkými nebo jedno z čísel od 1 do 5.
    • Funkce scanf C, podle popisu, vrátí číslo rovno úspěšnému počtu záznamů v proměnných. Pokud scanf zaznamená 3 proměnné, výsledek úspěšného fungování funkce bude návratem čísla 3. Pokud scanf nemohl zapsat žádné proměnné, výsledek by byl 0. Nakonec, jestliže scanf nemohl vůbec začít z nějakého důvodu, výsledek by byl EOF .
    • Pokud funkce scanf () dokončila svou práci nesprávně. Například scanf ("% d", x) - očekávaný počet a vstupy přinesly symboly. Další volání scanf () se spustí od místa, kde byl ve vstupním proudu, kde skončil předchozí volání funkce. Chcete-li tento problém překonat, musíte se zbavit problematických symbolů. To lze provést například zavoláním scanf ("% * s"). To znamená, že funkce čte řetězec znaků a hodí to. Tímto mazaným způsobem můžete pokračovat v zadávání požadovaných dat.
    • V některých implementacích scanf () je použití ";" v sadě naskenovaných znaků nepřípustné.
    • Specifikátor "% c" čte každý znak z proudu. To znamená, že také čte oddělovač symbolů. Chcete-li přeskočit znak oddělovače a pokračovat ve čtení požadovaného znaku, můžete použít "% 1s".
    • Používáte-li kvalifikátor "c", můžete použít šířku "% 10c", ale pak ve formě proměnné scanf musíte převést pole elementů char.
    • "% [A-z]" znamená "všechna malá písmena anglické abecedy" a "% [z-a]" znamená pouze 3 znaky: lsquo-zrsquo-, lsquo-arsquo-, lsquo - rsquo. Jinými slovy, symbol ";" znamená rozsah, pouze pokud je mezi dvěma znaky, které jsou ve správném pořadí. Pokud je znak ";" na konci výrazu, na začátku nebo v nesprávném pořadí znaků na obou stranách, pak je to jen pomlčka, nikoli rozsah.
    C ++ kód

    Závěr

    Toto doplňuje popis scanf C. Jedná se o pěknou pohodlnou funkci pro práci v malých programech a metodě procedurálního programování. Hlavní nevýhodou je však množství nepředvídatelných chyb, ke kterým může dojít při použití scanf. Proto je popis scanf C v programování nejlépe uchován před očima. Ve velkých profesionálních projektech se používají proudy iostream, protože mají schopnosti vyšší úrovně, lépe umožňují chytit a zpracovávat chyby a pracují s velkým množstvím informací. Rovněž je třeba poznamenat, že popis scanf C v ruštině je dostupný na mnoha síťových zdrojích, stejně jako příklady jeho použití v důsledku věku funkce. Proto v případě potřeby můžete vždy najít odpověď na tematické fóra.

    Sdílet na sociálních sítích:

    Podobné
  • © 2021 nisfarm.ru