Scanf C funkció leírása
Scanf C funkció leírása

Videó: Scanf C funkció leírása

Videó: Scanf C funkció leírása
Videó: REVAN - THE COMPLETE STORY 2024, November
Anonim

Ebben a cikkben a scanf() függvényt általános formában, egy adott szabványra való hivatkozás nélkül tekintjük, ezért itt minden C99, C11, C++11, C++14 szabvány adatai szerepelnek. Lehetséges, hogy egyes szabványokban a függvény a cikkben bemutatott anyagtól eltérően működik.

scanf C függvény - leírás

A scanf() az stdio.h(C) és a cstdio(C++) fejlécfájlokban található függvény, más néven formázott programbemenet. A scanf beolvassa a karaktereket a szabványos bemeneti adatfolyamból (stdin), és a formátumnak megfelelően átalakítja, majd a megadott változókba írja. Formátum - azt jelenti, hogy az adatok átvételkor egy bizonyos formára konvertálódnak. Így a scanf C függvény leírása:

scanf("%formátum", &változó1[, &változó2, […]), ahol a változók címként kerülnek átadásra. A függvénynek való változók ilyen módon való átadásának oka nyilvánvaló: munka eredményeként a hibák jelenlétét jelző értéket ad vissza, ígyA változók értékének megváltoztatásának egyetlen módja a cím átadása. Ezenkívül ennek a módszernek köszönhetően a függvény bármilyen típusú adatot képes feldolgozni.

Egyes programozók az olyan függvényeket, mint a scanf() vagy a printf() eljárásként hivatkoznak más nyelvekkel való analógia miatt.

A Scanf lehetővé teszi az összes alapvető nyelvtípus bevitelét: char, int, float, string stb. String típusú változók esetén nem kell megadni az "&" címjelet, mivel a string típusú változó egy tömb, neve pedig a tömb első elemének címe a számítógép memóriájában..

C használata C++-ban
C használata C++-ban

Adatbeviteli formátum vagy vezérlőkarakterlánc

Kezdje azzal, hogy nézze meg a leírásból a scanf C függvény példáját.


include int main() { int x; while (scanf("%d", &x)==1) printf("%d\n", x); visszatérés 0; //követelmény linux rendszerekhez }

A beviteli formátum a következő négy paraméterből áll: %[width][modifiers] type. Ebben az esetben a "%" jel és a típus kötelező paraméterek. Vagyis a minimális formátum így néz ki: „%s”, „%d” és így tovább.

Általában a formátum karakterláncát alkotó karakterek a következőkre oszlanak:

  • formátumspecifikátorok - bármi, ami %-al kezdődik;
  • elválasztó vagy szóköz karakterek – szóköz, tabulátor(t), újsor (n);
  • a szóközön kívüli karakterek.

A funkció nem biztos, hogy biztonságos.

Használja a scanf_s()-et a scanf() helyett.

(üzenet a Visual Studiotól)

Típus- vagy formátumspecifikátorok, vagy konverziós karakterek, vagy vezérlőkarakterek

bináris kód
bináris kód

A scanf C deklarációnak tartalmaznia kell legalább egy formátum-specifikációt, amely a „%” kezdetű kifejezések végén van megadva. Megmondja a programnak, hogy milyen típusú adatot várjon bevitelkor, általában a billentyűzetről. Az összes formátum-specifikáció listája az alábbi táblázatban.

Típus Jelentés
1 %c A program karakterbevitelre vár. Az írandó változónak char karaktertípusúnak kell lennie.
2 %d A program egy decimális számú egész típusú bevitelt vár. A változónak int típusúnak kell lennie.

3

%i A program egy decimális számú egész típusú bevitelt vár. A változónak int típusúnak kell lennie.
4 %e, %E A program egy lebegőpontos (vessző) szám exponenciális bevitelét várja. A változónak float típusúnak kell lennie.
5 %f A program lebegőpontos számot (vesszőt) vár. A változónak float típusúnak kell lennie.
6 %g, %G A program lebegőpontos számot (vesszőt) vár. A változónak float típusúnak kell lennie.
7 %a A program lebegőpontos számot (vesszőt) vár. A változónak float típusúnak kell lennie.
8 %o A program oktális számot vár. A változónak int típusúnak kell lennie.
9 %s A program egy karakterlánc bevitelére vár. A karakterlánc bármely karakter halmaza az első talált elválasztó karakterig. A változónak string típusúnak kell lennie.
10 %x, %X A program hexadecimális számra vár. A változónak int típusúnak kell lennie.
11 %p A változó mutató bevitelt vár. A változónak mutató típusúnak kell lennie.
12 %n Egy változóba egy egész értéket ír, amely megegyezik a scanf függvény által eddig beolvasott karakterek számával.
13 %u A program előjel nélküli egész számot olvas be. A változó típusának előjel nélküli egésznek kell lennie.
14 %b A program bináris számra vár. A változónak int típusúnak kell lennie.
15 %

Beolvasott karakterkészlet. A program karakterek bevitelére vár.a szögletes zárójelben megadott korlátozott készletből. A scanf mindaddig működik, amíg a megadott készletből vannak karakterek a bemeneti adatfolyamon.

16 %% Jelölje be: "%".

Karakterek a formátumban

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

Csillag szimbólum ()

A csillag () egy jelző, amely azt jelzi, hogy a hozzárendelési műveletet el kell tiltani. Közvetlenül a „%” jel után csillag kerül. Például


scanf("%d%c%d", &x, &y); //a karakter figyelmen kívül hagyása két egész szám között. scanf("%s%d%s", str, str2); //a két karakterlánc közötti egész szám figyelmen kívül hagyása.

Azaz ha beírja a "45-20" sort a konzolba, a program a következőket fogja tenni:

  1. Az "x" változóhoz 45 érték lesz rendelve.
  2. Az "y" változóhoz 20 lesz rendelve.
  3. És a mínuszjel (kötőjel) "-" figyelmen kívül lesz hagyva a "%c"-nek köszönhetően.

Szélesség (vagy mezőszélesség)

Ez egy egész szám a "%" jel és a formátummeghatározó között, amely megadja az aktuális olvasási műveletben olvasható karakterek maximális számát.


scanf("%20s", str); //olvassa be az első 20 karaktert a beviteli adatfolyamból

Van néhány fontos dolog, amit szem előtt kell tartani:

  1. A scanf leáll, ha elválasztó karaktert talál, még akkor is, ha nem számolt 20 karaktert.
  2. Ha több mint 20 karaktert ad meg, csak az első 20 karakter kerül beírásra a str.

Módosítóktípus (vagy pontosság)

splash kód
splash kód

Ezek speciális jelzők, amelyek módosítják a bemenetre várt adatok típusát. A zászló a típusmeghatározótól balra van megadva:

  • L vagy l (kis L) Ha "l"-t használunk a d, i, o, u, x specifikációkkal, a zászló jelzi a programnak, hogy hosszú int bemenetre van szükség. Ha „l”-t használunk az e vagy f specifikátorral, a jelző jelzi a programnak, hogy dupla értékre kell számítania. Az "L" használata azt jelzi a programnak, hogy hosszú duplázás várható. Az "l" használata a "c" és "s" specifikációkkal jelzi a programnak, hogy olyan kétbájtos karakterek várhatók, mint a wchar_t. Például: "%lc", "%ls", "%l[asd]".
  • A h egy zászló, amely a rövid típust jelzi.
  • hh - azt jelzi, hogy a változó egy előjeles vagy előjel nélküli karakter értékre mutató mutató. A zászló a d, i, o, u, x, n specifikációkkal használható.
  • ll (két kis L) – azt jelzi, hogy a változó egy előjeles long long int vagy előjel nélküli long long int típusú értékre mutató mutató. A zászlót a következő specifikációkkal használják: d, i, o, u, x, n.
  • j – azt jelzi, hogy a változó az stdint.h fejlécfájl intmax_t vagy uintmax_t típusára mutató mutató. A következő jellemzőkkel együtt használva: d, i, o, u, x, n.
  • z - azt jelzi, hogy a változó a size_t típusra mutató mutató, amelynek meghatározása az stddef.h fájlban található. A következő jellemzőkkel együtt használva: d, i, o, u, x, n.
  • t - azt jelzi, hogy a változó egy mutató a ptrdiff_t típusra. Meghatározás bekapcsolvaez a típus az stddef.h-ban található. A következő jellemzőkkel együtt használva: d, i, o, u, x, n.

Egyértelműbben, a módosítókkal ellátott kép táblázatként is ábrázolható. A scanf C ilyen leírása a programozók számára világosabb lesz.

Típusmeghatározók és módosítók
Típusmeghatározók és módosítók

Egyéb karakterek

A formátumban talált karakterek el lesznek vetve. Ugyanakkor meg kell jegyezni, hogy a szóköz vagy elválasztó karakterek (újsor, szóköz, tabulátor) jelenléte a vezérlőkarakterláncban a függvény eltérő viselkedéséhez vezethet. Az egyik verzióban a scanf() beolvassa tetszőleges számú elválasztó mentése nélkül, amíg az elválasztótól eltérő karakterrel nem találkozik, egy másik verzióban pedig a szóközök (csak azok) nem játszanak szerepet, és a "%d + %d" kifejezés egyenértékű a következővel: "% d+%d".

C++ kód példa
C++ kód példa

Példák

Nézzünk néhány példát, amelyek segítenek gondolkodni és jobban megérteni a függvény működését.


scanf("%3s", str); //ha beírja az "1d2s3d1;3" karakterláncot a konzolba, csak az "1d2" lesz kiírva a str scanf("%dminus%d", &x, &y); //a két szám közötti mínusz karakterek el lesznek vetve scanf("%5[0-9]", str); // karakterek kerülnek be az str-be, amíg nem lesz 5 karakter, és a karakterek 0 és 9 közötti számok. scanf("%lf", &d); //dupla bemenetet várnak scanf("%hd", &x); //várt típusszám short scanf("%hu", &y); //előjel nélküli számot várunk short scanf("lx", &z); //típus várt száma long int

KitólAz alábbi példák bemutatják, hogyan változik a várt szám különböző szimbólumok használatával.

scanf C - leírás kezdőknek

Ez a rész hasznos lesz kezdőknek. Gyakran nem annyira a scanf C teljes leírására van szükséged, mint inkább a funkció működésének részleteire.

  • Ez a funkció kissé elavult. A különböző verziójú könyvtárakban számos különböző megvalósítás létezik. Például a továbbfejlesztett scanf S C funkció, amelynek leírása megtalálható a Microsoft weboldalán.
  • A formátumban lévő specifikációk számának meg kell egyeznie a függvénynek átadott argumentumok számával.
  • A bemeneti adatfolyam elemeket csak elválasztó karakterekkel szabad elválasztani: szóköz, tabulátor, új sor. Vessző, pontosvessző, pont stb. – ezek a karakterek nem a scanf() függvény elválasztói.
  • Ha a scanf elválasztó karaktert talál, a bevitel leáll. Ha egynél több változót kell olvasni, akkor a scanf továbblép a következő változó olvasására.
  • A bemeneti adatformátum legkisebb következetlensége a program előre nem látható eredményéhez vezet. Nos, ha a program csak hibával ér véget. De gyakran a program továbbra is működik, és rosszul csinálja.
  • scanf("%20s …", …); Ha a bemeneti adatfolyam meghaladja a 20 karaktert, akkor a scanf beolvassa az első 20 karaktert, és vagy megszakítja, vagy továbblép a következő változó olvasására, ha van megadva. Ebben az esetben a scanf következő hívása attól a ponttól folytatja a bemeneti adatfolyam olvasását, ahol a scanf előző hívása leállt. Ha az első 20 olvasásakorkaraktereket, ha határoló karaktert talál, a scanf megszakítja vagy folytatja a következő változó olvasását, még akkor is, ha nem olvasott be 20 karaktert az első változóhoz. Ebben az esetben az összes olvasatlan karakter a következő változóhoz lesz csatolva.
  • Ha a beolvasott karakterkészlet "^" karakterrel kezdődik, akkor a scanf addig olvassa az adatokat, amíg nem talál egy határoló karaktert vagy egy karaktert a készletből. Például a "%[^A-E1-5]" addig olvassa be az adatokat az adatfolyamból, amíg meg nem találja a nagybetűs angol karakterek egyikét A-tól E-ig vagy az 1-től 5-ig terjedő számok egyikét.
  • A scanf C függvény a leírtak szerint a változók sikeres írásainak számával egyenlő számot ad vissza. Ha a scanf 3 változót ír, akkor a függvény sikereredménye a 3-as számot adja vissza. Ha a scanf egyetlen változót sem tudott írni, akkor az eredmény 0 lesz. És végül, ha a scanf valamilyen okból egyáltalán nem tudott elindulni, a az eredmény EOF lesz.
  • Ha a scanf() függvény hibásan végződött. Például scanf("%d", &x) – egy számot vártak, de karakterek érkeztek bemenetként. A következő scanf() hívás a bemeneti adatfolyam azon pontján kezdődik, ahol az előző függvényhívás véget ért. A probléma megoldásához meg kell szabadulni a problémás karakterektől. Ezt megteheti például a scanf("%s") meghívásával. Vagyis a függvény beolvas egy karakterláncot, és kidobja. Ezen a trükkös módon folytathatja a szükséges adatok megadását.
  • A scanf() egyes megvalósításaiban a "-" nem megengedett a beolvasott karakterkészletben.
  • A "%c" megadó minden karaktert beolvas az adatfolyamból. Vagyis az elválasztó karaktert is olvassa. A határoló karakter kihagyásához és a kívánt karakter olvasásának folytatásához használja a "%1s"-t.
  • A "c" specifikáció használatakor megengedett a "%10c" szélesség használata, de ekkor egy char típusú elemtömböt kell változóként átadni a scanf függvénynek.
  • „%[a-z]” jelentése „az angol ábécé összes kis betűje”, a „%[z-a]” pedig mindössze 3 karaktert jelent: „z”, „a”, „-”. Más szavakkal, a "-" karakter csak akkor jelent tartományt, ha két, a megfelelő sorrendben lévő karakter között van. Ha a "-" egy kifejezés végén, elején vagy a karakterek rossz sorrendjében van a két oldalán, akkor ez csak egy kötőjel karakter, nem egy tartomány.
C++ kód
C++ kód

Következtetés

Ezzel véget is ért a scanf C leírása. Ez egy nagyon praktikus funkció kis programokban való munkavégzéshez és procedurális programozási módszer használatához. A fő hátrány azonban a scanf használatakor előforduló előre nem látható hibák száma. Ezért a scanf C leírását programozáskor a legjobb a szemed előtt tartani. A nagy szakmai projektekben az iostreameket alkalmazzák, mivel magasabb szintű képességekkel rendelkeznek, jobban képesek elkapni és kezelni a hibákat, és jelentős mennyiségű információval is dolgoznak. Azt is meg kell jegyezni, hogy a scanf C orosz nyelvű leírása számos hálózati forrásból elérhető, és példák is találhatók rá.használat, a funkció kora miatt. Ezért ha szükséges, mindig megtalálhatja a választ a tematikus fórumokon.

Ajánlott: