2024 Szerző: Howard Calhoun | [email protected]. Utoljára módosítva: 2024-01-17 18:54
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..
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
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
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:
- Az "x" változóhoz 45 érték lesz rendelve.
- Az "y" változóhoz 20 lesz rendelve.
- É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:
- A scanf leáll, ha elválasztó karaktert talál, még akkor is, ha nem számolt 20 karaktert.
- 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)
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.
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".
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.
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:
Lízing: előnyei és hátrányai, fő funkció, besorolás, tippek és trükkök
A lízing, mint pénzügyi tevékenységi forma meghatározása, funkciói, előnyei és hátrányai. Általános információk, lízingkapcsolatok osztályozása. A lízinggel történő autóvásárlás előnyei és hátrányai, mint a leggyakoribb termék. Javaslatok a lízingcég kiválasztásához
Az értékesítési emeleti kontroller munkaköri leírása: feladatai, munkaköri leírása és követelményei
Több száz különböző szakma létezik, és az értékesítési padlóvezérlő is ezek közé tartozik. Ez a szakma aligha nevezhető tekintélyesnek. Nem álmodoznak róla, az iskola padjából kiindulva. De ez az egyik alapvető. Képviselőinek munkája nem annyira feltűnő és nyilvánvaló, de a társadalom számára előnyös. Ismerkedjünk meg az értékesítési padlóvezérlő munkaköri feladataival és e szakma egyéb jellemzőivel
A vezető feladatai: kulcsfontosságú felelősségek, követelmények, szerep, funkció és a cél elérése
Hamarosan promóciót tervez? Ideje tehát felkészülni rá. Milyen kihívásokkal szembesülnek a vezetők naponta? Mit kell tudnia annak az embernek, aki a jövőben vállalja a felelősség terhét másokért? Olvasson róla mindent alább
A tartalékok osztályozása szerkezet és funkció szerint
Mi az egyszerű, gyártási készlet? Fő fajtáik. A tartalékok csoportosítása rendeltetésük szerint. Osztályozás a logisztikai láncban elfogl alt hely szerint, a logisztikai működés vonatkozásában, funkcionális cél szerint, a logisztikai rendszer vonatkozásában, idő szerint
Ki a menedzser és mivel foglalkozik? Öt fő funkció
Ki a menedzser és mivel foglalkozik? Ezt a kérdést teszik fel most az álláskeresők a szakma növekvő népszerűsége kapcsán. A legtöbben úgy gondolják, hogy a vezető fő feladata a munkafolyamat és a személyzet irányítása. Valójában minden a tevékenységi területtől függ. Például, ha arról beszélünk, hogy mit csinál egy értékesítési vezető, akkor árukat vagy szolgáltatásokat kínál az ügyfeleknek