Popis funkcie Scanf C
Popis funkcie Scanf C

Video: Popis funkcie Scanf C

Video: Popis funkcie Scanf C
Video: Цифровизация в ресторанах: немецкие рестораторы догоняют | БЛЮДО от METRO Новости 2024, Septembra
Anonim

V tomto článku sa funkcia scanf() uvažuje vo všeobecnej forme bez odkazu na konkrétny štandard, takže sú tu zahrnuté údaje zo všetkých štandardov C99, C11, C++11, C++14. Možno, že v niektorých štandardoch funkcia funguje s rozdielmi od materiálu prezentovaného v článku.

funkcia scanf C – popis

scanf() je funkcia nachádzajúca sa v hlavičkových súboroch stdio.h(C) a cstdio(C++), známa aj ako formátovaný vstup programu. scanf číta znaky zo štandardného vstupného toku (stdin) a konvertuje ich podľa formátu, potom ich zapisuje do určených premenných. Formát – znamená, že údaje sa po prijatí prevedú do určitej podoby. Funkcia scanf C je teda opísaná:

scanf("%formát", &variable1[, &variable2, […]), kde sa premenné odovzdávajú ako adresy. Dôvod tohto spôsobu odovzdávania premenných do funkcie je zrejmý: v dôsledku práce vráti hodnotu indikujúcu prítomnosť chýb, takžejediný spôsob, ako zmeniť hodnoty premenných, je prejsť cez adresu. Aj vďaka tejto metóde môže funkcia spracovať dáta akéhokoľvek typu.

Niektorí programátori označujú funkcie ako scanf() alebo printf() ako procedúry z dôvodu analógie s inými jazykmi.

Scanf umožňuje zadávanie všetkých základných typov jazykov: char, int, float, string atď. V prípade premenných typu string nie je potrebné uvádzať znamienko adresy - "&", keďže premenná typu string je pole a jej názov je adresa prvého prvku poľa v pamäti počítača..

Použitie C v C++
Použitie C v C++

Formát zadávania údajov alebo riadiaci reťazec

Začnite tým, že sa pozriete na príklad funkcie scanf C z popisu.


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

Vstupný formát pozostáva z nasledujúcich štyroch parametrov: %[width][modifikátory] typ. V tomto prípade je znak "%" a typ povinnými parametrami. To znamená, že minimálny formát vyzerá takto: „%s“, „%d“atď.

Vo všeobecnosti sa znaky, ktoré tvoria formátovací reťazec, delia na:

  • špecifikátory formátu – čokoľvek začínajúce %;
  • oddeľovacie alebo medzerové znaky – sú to medzera, tabulátor (t), nový riadok (n);
  • znaky iné ako medzery.

Funkcia nemusí byť bezpečná.

Použite scanf_s() namiesto scanf().

(správa z Visual Studia)

Zadajte alebo formátujte špecifikátory alebo znaky konverzie alebo riadiace znaky

binárny kód
binárny kód

Deklarácia scanf C musí obsahovať aspoň špecifikátor formátu, ktorý je uvedený na konci výrazov začínajúcich na "%". Hovorí programu, aký typ údajov má očakávať pri zadávaní, zvyčajne z klávesnice. Zoznam všetkých špecifikátorov formátu v tabuľke nižšie.

Typ Význam
1 %c Program čaká na zadanie znaku. Premenná, ktorá sa má zapísať, musí byť typu znakov char.
2 %d Program očakáva zadanie desiatkového čísla typu celé číslo. Premenná musí byť typu int.
3 %i Program očakáva zadanie desiatkového čísla typu celé číslo. Premenná musí byť typu int.
4 %e, %E Program očakáva zadanie čísla s pohyblivou rádovou čiarkou (čiarkou) v exponenciálnom tvare. Premenná musí byť typu float.
5 %f Program očakáva číslo s pohyblivou rádovou čiarkou (čiarkou). Premenná musí byť typu float.
6 %g, %G Program očakáva číslo s pohyblivou rádovou čiarkou (čiarkou). Premenná musí byť typu float.
7 %a Program očakáva číslo s pohyblivou rádovou čiarkou (čiarkou). Premenná musí byť typu float.
8 %o Program očakáva osmičkové číslo. Premenná musí byť typu int.
9 %s

Program čaká na zadanie reťazca. Reťazec je množina ľubovoľných znakov až po prvý nájdený oddeľovací znak. Premenná musí byť typu string.

10 %x, %X Program čaká na šestnástkové číslo. Premenná musí byť typu int.
11 %p Premenná očakáva vstup ukazovateľa. Premenná musí byť typu ukazovateľ.
12 %n Zapíše do premennej celočíselnú hodnotu rovnajúcu sa počtu znakov, ktoré doteraz čítala funkcia scanf.
13 %u Program prečíta celé číslo bez znamienka. Typ premennej musí byť celé číslo bez znamienka.
14 %b Program čaká na binárne číslo. Premenná musí byť typu int.
15 % Naskenovaná sada znakov. Program čaká na zadanie znakov.z obmedzeného fondu uvedeného v hranatých zátvorkách. scanf bude fungovať, pokiaľ budú vo vstupnom toku znaky zo špecifikovanej sady.
16 %% Podpíšte "%".

Znaky vo formáte reťazca

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

Symbol hviezdičky ()

Hviezdička () je príznak označujúci, že operácia priradenia by mala byť potlačená. Hneď za znakom "%" sa umiestni hviezdička. Napríklad


scanf("%d%c%d", &x, &y); //ignoruje znak medzi dvoma celými číslami. scanf("%s%d%s", str, str2); //ignoruje celé číslo medzi dvoma reťazcami.

To znamená, že ak do konzoly zadáte riadok „45-20“, program urobí nasledovné:

  1. Premennej „x“bude priradená hodnota 45.
  2. Premennej "y" bude priradená hodnota 20.
  3. A znamienko mínus (pomlčka) „-“bude ignorované vďaka „%c“.

Šírka (alebo šírka poľa)

Toto je celé číslo medzi znakom "%" a špecifikátorom formátu, ktorý určuje maximálny počet znakov na čítanie v aktuálnej operácii čítania.


scanf("%20s", str); //prečítajte prvých 20 znakov zo vstupného streamu

Je potrebné mať na pamäti niekoľko dôležitých vecí:

  1. scanf sa ukončí, ak narazí na oddeľovací znak, aj keď nepočítal 20 znakov.
  2. Ak zadáte viac ako 20 znakov, do str. sa zapíše iba prvých 20 znakov

Modifikátorytyp (alebo presnosť)

úvodný kód
úvodný kód

Toto sú špeciálne príznaky, ktoré upravujú typ údajov očakávaných pre vstup. Príznak je špecifikovaný naľavo od špecifikátora typu:

  • L alebo l (malé L) Keď sa použije "l" so špecifikátormi d, i, o, u, x, príznak hovorí programu, že sa očakáva vstup typu long int. Pri použití "l" so špecifikátorom e alebo f príznak hovorí programu, že by mal očakávať dvojnásobnú hodnotu. Použitie "L" hovorí programu, že sa očakáva dlhé zdvojnásobenie. Použitie "l" so špecifikátormi "c" a "s" hovorí programu, že sa očakávajú dvojbajtové znaky ako wchar_t. Napríklad "%lc", "%ls", "%l[asd]".
  • h je príznak označujúci krátky typ.
  • hh – označuje, že premenná je ukazovateľ na hodnotu znaku so znamienkom alebo bez znamienka. Príznak možno použiť so špecifikátormi d, i, o, u, x, n.
  • ll (dve malé L) – označuje, že premenná je ukazovateľ na hodnotu typu sign long long int alebo unsigned long long int. Príznak sa používa so špecifikátormi: d, i, o, u, x, n.
  • j - označuje, že premenná je ukazovateľ na typ intmax_t alebo uintmax_t z hlavičkového súboru stdint.h. Používa sa so špecifikátormi: d, i, o, u, x, n.
  • z - označuje, že premenná je ukazovateľ na typ size_t, ktorého definícia je v stddef.h. Používa sa so špecifikátormi: d, i, o, u, x, n.
  • t – označuje, že premenná je ukazovateľ na typ ptrdiff_t. Definícia zapnutátento typ je v stddef.h. Používa sa so špecifikátormi: d, i, o, u, x, n.

Presnejšie, obrázok s modifikátormi môže byť reprezentovaný ako tabuľka. Takýto popis scanf C pre programátorov bude prehľadnejší.

Typové špecifikátory a modifikátory
Typové špecifikátory a modifikátory

Iné znaky

Všetky znaky nájdené vo formáte budú vyradené. Zároveň je potrebné poznamenať, že prítomnosť medzier alebo oddeľovacích znakov (nový riadok, medzera, tabulátor) v riadiacom reťazci môže viesť k odlišnému správaniu funkcie. V jednej verzii bude scanf() čítať bez uloženia akéhokoľvek počtu oddeľovačov, kým nenarazí na iný znak ako oddeľovač, a v inej verzii nehrajú medzery (iba ony) žiadnu rolu a výraz "%d + %d" je ekvivalentné "% d+%d".

Príklad kódu C++
Príklad kódu C++

Príklady

Pozrime sa na niekoľko príkladov, ktoré vám pomôžu premýšľať a lepšie pochopiť, ako funkcia funguje.


scanf("%3s", str); //ak zadáte do konzoly reťazec "1d2s3d1;3", do str scanf("%dminus%d", &x, &y) sa zapíše iba "1d2"); //mínusové znaky medzi dvoma číslami budú vyradené scanf("%5[0-9]", str); // znaky sa budú zadávať do str, kým nebude 5 znakov a znaky budú čísla od 0 do 9. scanf("%lf", &d); //očakávame dvojitý vstup scanf("%hd", &x); //očakávané číslo typu short scanf("%hu", &y); //očakávame číslo bez znamienka short scanf("lx", &z); //očakávané číslo typu long int

OdPríklady nižšie ukazujú, ako sa očakávaný počet mení pomocou rôznych symbolov.

scanf C – popis pre začiatočníkov

Táto sekcia bude užitočná pre začiatočníkov. Často potrebujete mať po ruke ani nie tak úplný popis scanf C, ako skôr podrobnosti o tom, ako funkcia funguje.

  • Táto funkcia je trochu zastaraná. Existuje niekoľko rôznych implementácií v knižniciach rôznych verzií. Napríklad vylepšená funkcia scanf S C, ktorej popis nájdete na stránke microsoftu.
  • Počet špecifikátorov vo formáte sa musí zhodovať s počtom argumentov odovzdaných funkcii.
  • Prvky vstupného prúdu musia byť oddelené iba oddeľovacími znakmi: medzera, tabulátor, nový riadok. Čiarka, bodkočiarka, bodka atď. – tieto znaky nie sú oddeľovače pre funkciu scanf().
  • Ak scanf narazí na oddeľovací znak, zadávanie sa zastaví. Ak existuje viac ako jedna premenná na čítanie, potom scanf prejde na čítanie ďalšej premennej.
  • Najmenšia nezrovnalosť vo formáte vstupných údajov vedie k nepredvídateľným výsledkom programu. No, ak program práve skončí s chybou. Program však často pokračuje v práci a robí to zle.
  • scanf("%20s …", …); Ak vstupný tok presiahne 20 znakov, potom scanf prečíta prvých 20 znakov a buď preruší, alebo prejde na čítanie ďalšej premennej, ak je špecifikovaná. V tomto prípade bude ďalšie volanie scanf pokračovať v čítaní vstupného toku od bodu, kde sa práca predchádzajúceho volania scanf zastavila. Ak pri čítaní prvých 20znakov, nájde sa oddeľovací znak, scanf preruší alebo bude pokračovať v čítaní ďalšej premennej, aj keď nenačítal 20 znakov pre prvú premennú. V tomto prípade budú všetky neprečítané znaky pripojené k ďalšej premennej.
  • Ak sada naskenovaných znakov začína znakom "^", potom scanf bude čítať dáta, kým nenarazí na oddeľovací znak alebo znak zo sady. Napríklad „%[^A-E1-5]“bude čítať údaje zo streamu, kým nenájdete jedno z veľkých anglických znakov od A do E alebo jedno z čísel od 1 do 5.
  • Funkcia scanf C, ako je popísaná, vracia číslo, ktoré sa rovná úspešnému počtu zápisov do premenných. Ak scanf zapíše 3 premenné, potom úspešný výsledok funkcie vráti číslo 3. Ak scanf nemohol zapísať žiadne premenné, potom výsledok bude 0. A nakoniec, ak sa scanf z nejakého dôvodu vôbec nemohol spustiť, výsledkom bude EOF.
  • Ak sa funkcia scanf() skončila nesprávne. Napríklad scanf("%d", &x) - číslo bolo očakávané, ale ako vstup boli prijaté znaky. Ďalšie volanie scanf() začne v bode vstupného toku, kde skončilo predchádzajúce volanie funkcie. Na prekonanie tohto problému je potrebné zbaviť sa problémových postáv. Dá sa to urobiť napríklad volaním scanf("%s"). To znamená, že funkcia prečíta reťazec znakov a zahodí ho. Týmto zložitým spôsobom môžete pokračovať v zadávaní potrebných údajov.
  • V niektorých implementáciách scanf() nie je "-" povolené v naskenovanej znakovej sade.
  • Špecifikátor "%c" číta každý znak zo streamu. To znamená, že prečíta aj oddeľovací znak. Ak chcete preskočiť oddeľovací znak a pokračovať v čítaní požadovaného znaku, môžete použiť "%1s".
  • Pri použití špecifikátora "c" je povolené použiť šírku "%10c", ale potom sa pole prvkov typu char musí odovzdať ako premenná do funkcie scanf.
  • „%[a-z]“znamená „všetky malé písmená anglickej abecedy“a „%[z-a]“znamená iba 3 znaky: „z“, „a“, „-“. Inými slovami, znak "-" znamená rozsah iba vtedy, ak je medzi dvoma znakmi, ktoré sú v správnom poradí. Ak je „-“na konci výrazu, na začiatku alebo v nesprávnom poradí znakov na oboch jeho stranách, potom je to len znak pomlčky, nie rozsah.
C++ kód
C++ kód

Záver

Toto uzatvára popis scanf C. Toto je pekná praktická funkcia pre prácu v malých programoch a pri použití metódy procedurálneho programovania. Hlavnou nevýhodou je však množstvo nepredvídateľných chýb, ktoré môžu pri používaní scanf nastať. Preto je najlepšie mať popis scanf C pri programovaní na očiach. Vo veľkých profesionálnych projektoch sa využívajú iostreamy, pretože majú možnosti vyššej úrovne, dokážu lepšie zachytiť a zvládnuť chyby a tiež pracujú s významným množstvom informácií. Treba tiež poznamenať, že popis scanf C v ruštine je k dispozícii na mnohých sieťových zdrojoch, ako aj jeho príkladypoužitie, vzhľadom na vek funkcie. Preto v prípade potreby vždy nájdete odpoveď na tematických fórach.

Odporúča: