Scanf C funktsiooni kirjeldus
Scanf C funktsiooni kirjeldus

Video: Scanf C funktsiooni kirjeldus

Video: Scanf C funktsiooni kirjeldus
Video: Рассказываем про негосударственные пенсионные фонды 2024, November
Anonim

Selles artiklis käsitletakse funktsiooni scanf() üldisel kujul, viitamata konkreetsele standardile, seega on siia kaasatud mis tahes C99, C11, C++11, C++14 standardite andmed. Võib-olla töötab see funktsioon mõnes standardis artiklis esitatud materjalist erinev alt.

scanf C-funktsioon – kirjeldus

scanf() on päisefailides stdio.h(C) ja cstdio(C++) asuv funktsioon, mida tuntakse ka vormindatud programmisisendina. scanf loeb tähemärgid standardsest sisendvoost (stdin) ja teisendab need vastav alt vormingule, seejärel kirjutab need määratud muutujatesse. Formaat – tähendab, et andmed teisendatakse kättesaamisel kindlale vormile. Seega kirjeldatakse funktsiooni scanf C:

scanf("% vorming", &muutuja1[, &muutuja2, […]), kus muutujad edastatakse aadressidena. Põhjus sellisel viisil muutujate funktsioonile edastamiseks on ilmne: töö tulemusena tagastab see väärtuse, mis näitab vigade olemasolu, nii etAinus viis muutujate väärtuste muutmiseks on aadressi edastamine. Lisaks saab funktsioon tänu sellele meetodile töödelda mis tahes tüüpi andmeid.

Mõned programmeerijad viitavad sellistele funktsioonidele nagu scanf() või printf() kui protseduuridele analoogia tõttu teiste keeltega.

Scanf võimaldab sisestada kõiki põhikeeletüüpe: char, int, float, string jne. Tüüpi string muutujate puhul ei ole vaja määrata aadressimärki - "&", kuna tüübistringi muutuja on massiiv ja selle nimi on massiivi esimese elemendi aadress arvuti mälus..

C kasutamine C++-s
C kasutamine C++-s

Andmesisestuse vorming või juhtstring

Alustuseks vaadake kirjeldusest funktsiooni scanf C näidet.


include int main() { int x; while (scanf("%d", &x)==1) printf("%d\n", x); tagasi 0; //nõue linuxi süsteemidele }

Sisestusvorming koosneb neljast järgmisest parameetrist: %[width][modifiers] type. Sel juhul on märk "%" ja tüüp kohustuslikud parameetrid. See tähendab, et minimaalne vorming näeb välja selline: "%s", "%d" ja nii edasi.

Üldiselt jagunevad vormingustringi moodustavad märgid järgmisteks osadeks:

  • vorminguspetsifikaatorid – kõik, mis algab %ga;
  • eraldavad või tühikud – need on tühik, tabeldusmärk (t), reavahetus (n);
  • märke peale tühikute.

Funktsioon ei pruugi olla ohutu.

Kasutage scanf() asemel scanf_s().

(sõnum Visual Studiolt)

Tüübi- või vorminguspetsifikaadid või teisendusmärgid või juhtmärgid

binaarne kood
binaarne kood

Scanf C deklaratsioon peab sisaldama vähem alt vorminguspetsifikaatorit, mis määratakse "%ga" algavate avaldiste lõpus. See annab programmile teada, millist tüüpi andmeid tuleb sisestamisel oodata, tavaliselt klaviatuurilt. Allolevas tabelis olevate vorminguspetsifikaatide loend.

Tüüp Tähendus
1 %c Programm ootab tähemärgi sisestamist. Kirjutatav muutuja peab olema märgitüüpi char.
2 %d Programm eeldab täisarvu tüüpi kümnendarvu sisestamist. Muutuja peab olema tüüpi int.
3 %i

Programm eeldab täisarvu tüüpi kümnendarvu sisestamist. Muutuja peab olema tüüpi int.

4 %e, %E Programm eeldab ujukomaarvu (koma) sisestamist eksponentsiaalsel kujul. Muutuja tüüp peab olema float.
5 %f Programm eeldab ujukomaarvu (koma). Muutuja tüüp peab olema float.
6 %g, %G Programm eeldab ujukomaarvu (koma). Muutuja tüüp peab olema float.
7 %a Programm eeldab ujukomaarvu (koma). Muutuja tüüp peab olema float.
8 %o Programm eeldab kaheksandarvu. Muutuja peab olema tüüpi int.
9 %s Programm ootab stringi sisestamist. String on mis tahes märkide kogum kuni esimese leitud eraldaja märgini. Muutuja tüüp peab olema string.
10 %x, %X Programm ootab kuueteistkümnendsüsteemi numbrit. Muutuja peab olema tüüpi int.
11 %p Muutuja eeldab kursori sisendit. Muutuja peab olema osuti tüüpi.
12 %n Kirjutab muutujale täisarvu väärtuse, mis võrdub funktsiooni scanf poolt seni loetud märkide arvuga.
13 %u Programm loeb märgita täisarvu. Muutuja tüüp peab olema märgita täisarv.
14 %b Programm ootab kahendarvu. Muutuja peab olema tüüpi int.
15 % Skannitud märgistik. Programm ootab märkide sisestamist.nurksulgudes määratud piiratud kogust. scanf töötab seni, kuni sisendvoos on määratud komplekti märke.
16 %% Märkige "%".

Tähemärgid vormingus stringis

C++ kood
C++ kood

Tähe sümbol ()

Tärn () on lipp, mis näitab, et määramise toiming tuleks maha suruda. Tärn pannakse kohe pärast märki "%". Näiteks


scanf("%d%c%d", &x, &y); //Ignoreeri kahe täisarvu vahel olevaid märke. scanf("%s%d%s", str, str2); //eirata täisarvu kahe stringi vahel.

See tähendab, et kui sisestate konsooli rea "45-20", teeb programm järgmist:

  1. Muutujale "x" omistatakse väärtus 45.
  2. Muutujale "y" omistatakse väärtus 20.
  3. Ja miinusmärki (kriips) "-" ignoreeritakse tänu "%c"-le.

Laius (või välja laius)

See on täisarv märgi "%" ja vorminguspetsifikaatori vahel, mis määrab praeguses lugemistoimingus loetavate märkide maksimaalse arvu.


scanf("%20s", str); //loe sisendvoost esimesed 20 tähemärki

Pidage meeles mõnda olulist asja:

  1. scanf lõpetatakse, kui see kohtab eraldusmärki, isegi kui see ei lugenud 20 tähemärki.
  2. Kui sisestatakse rohkem kui 20 tähemärki, kirjutatakse stringi ainult esimesed 20 tähemärki.

Modifikaatoridtüüp (või täpsus)

splash kood
splash kood

Need on spetsiaalsed lipud, mis muudavad sisestamiseks oodatavate andmete tüüpi. Lipp on määratud tüübispetsifikaatorist vasakul:

  • L või l (väike L) Kui "l" kasutatakse koos spetsifikatsioonidega d, i, o, u, x, annab lipp programmile teada, et oodata on pikka int-sisendit. Kui kasutate "l" koos e või f spetsifikaatoriga, ütleb lipp programmile, et see peaks ootama topeltväärtust. "L" kasutamine ütleb programmile, et oodata on pikka duublit. "l" kasutamine koos spetsifikaatidega "c" ja "s" ütleb programmile, et oodata on kahebaidiseid märke, nagu wchar_t. Näiteks "%lc", "%ls", "%l[asd]".
  • h on lipp, mis näitab lühikest tüüpi.
  • hh – näitab, et muutuja on kursor märgilise tähemärgi või märgita tähemärgi väärtusele. Lippu saab kasutada määrajatega d, i, o, u, x, n.
  • ll (kaks väikest L-i) – näitab, et muutuja on osuti väärtusele, mille tüüp on märgistatud long long int või unsigned long long int. Lippu kasutatakse koos tähistustega: d, i, o, u, x, n.
  • j – näitab, et muutuja on kursor päisefailist stdint.h tüübile intmax_t või uintmax_t. Kasutatakse koos täpsustajatega: d, i, o, u, x, n.
  • z – näitab, et muutuja on kursor size_t tüübile, mille definitsioon on failis stddef.h. Kasutatakse koos täpsustajatega: d, i, o, u, x, n.
  • t – näitab, et muutuja on osuti tüübile ptrdiff_t. Definitsioon sisse lülitatudsee tüüp on failis stddef.h. Kasutatakse koos täpsustajatega: d, i, o, u, x, n.

Selgem alt saab modifikaatoritega pilti esitada tabelina. Selline scanf C kirjeldus programmeerijatele on selgem.

Tüübi määrajad ja modifikaatorid
Tüübi määrajad ja modifikaatorid

Muud tegelased

Kõik vormingus leitud märgid jäetakse kõrvale. Samal ajal tuleb märkida, et tühikute või eraldavate märkide (reavahetus, tühik, tabeldusmärk) olemasolu juhtstringis võib põhjustada funktsiooni erineva käitumise. Ühes versioonis loeb scanf() ilma eraldajaid salvestamata seni, kuni kohtab mõnda muud märki peale eraldaja, ja teises versioonis ei mängi tühikud (ainult need) rolli ja avaldis "%d + %d" võrdub "% d+%d".

C++ koodi näide
C++ koodi näide

Näited

Vaatame mõnda näidet, mis aitavad teil mõelda ja funktsiooni toimimist paremini mõista.


scanf("%3s", str); //kui sisestate konsooli stringi "1d2s3d1;3", kirjutatakse str scanf("%dminus%d", &x, &y) ainult "1d2"; //miinusmärgid kahe numbri vahel jäetakse kõrvale scanf("%5[0-9]", str); // märgid sisestatakse str-sse seni, kuni on 5 märki ja märgid on numbrid vahemikus 0 kuni 9. scanf("%lf", &d); //oodata topeltsisendit scanf("%hd", &x); //eeldatav tüübi arv short scanf("%hu", &y); //oodata märgita numbrit short scanf("lx", &z); //eeldatav tüübi arv long int

AlatesAllolevad näited näitavad, kuidas eeldatav arv erinevaid sümboleid kasutades muutub.

scanf C – kirjeldus algajatele

See jaotis on kasulik algajatele. Sageli peab teil olema käepärast mitte niivõrd Scanf C täielik kirjeldus, kuivõrd funktsiooni toimimise üksikasjad.

  • See funktsioon on mõnevõrra vananenud. Erinevate versioonide teekides on mitu erinevat rakendust. Näiteks täiustatud funktsioon scanf S C, mille kirjelduse leiate Microsofti veebisaidilt.
  • Spetsifikaatorite arv vormingus peab ühtima funktsioonile edastatud argumentide arvuga.
  • Sisendvoo elemendid peavad olema eraldatud ainult eraldusmärkidega: tühik, tabeldusmärk, uus rida. Koma, semikoolon, punkt jne – need märgid ei ole funktsiooni scanf() eraldajad.
  • Kui scanf kohtab eraldusmärki, siis sisestus peatatakse. Kui lugeda on rohkem kui üks muutuja, liigub scanf järgmise muutuja lugemise juurde.
  • Vähiim ebaühtlus sisendandmete vormingus viib programmi ettearvamatute tulemusteni. Noh, kui programm lihts alt lõpeb veaga. Kuid sageli programm jätkab tööd ja teeb seda valesti.
  • scanf("%20s …", …); Kui sisendvoog ületab 20 tähemärki, loeb scanf esimesed 20 tähemärki ja kas katkestab või jätkab järgmise muutuja lugemisega, kui see on määratud. Sel juhul jätkab järgmine skannimiskutse sisendvoo lugemist punktist, kus eelmise Scanf-i kõne töö peatus. Kui lugedes esimest 20märke, tuvastatakse eraldusmärk, katkestab scanf või jätkab järgmise muutuja lugemist, isegi kui see ei lugenud esimese muutuja jaoks 20 tähemärki. Sel juhul lisatakse kõik lugemata märgid järgmisele muutujale.
  • Kui skannitud märkide komplekt algab tähega "^", loeb scanf andmeid, kuni kohtab eraldaja või märgi komplektist. Näiteks "%[^A-E1-5]" loeb andmeid voost seni, kuni leitakse üks ingliskeelsetest suurtähtedest A-st E-ni või mõni number 1 kuni 5.
  • Funktsioon scanf C, nagu kirjeldatud, tagastab arvu, mis on võrdne muutujate edukate kirjutamiste arvuga. Kui scanf kirjutab 3 muutujat, tagastab funktsiooni edutulemus numbri 3. Kui scanf ei saanud ühtegi muutujat kirjutada, on tulemuseks 0. Ja lõpuks, kui scanf ei saanud mingil põhjusel üldse käivituda, siis tulemuseks on EOF.
  • Kui funktsioon scanf() lõppes valesti. Näiteks scanf("%d", &x) – oodati numbrit, kuid sisendiks saadi märgid. Järgmine scanf() kutse algab sisendvoo punktist, kus eelmine funktsioonikutse lõppes. Sellest probleemist ülesaamiseks on vaja probleemsetest tegelastest lahti saada. Seda saab teha näiteks kutsudes välja scanf("%s"). See tähendab, et funktsioon loeb tähemärkide jada ja viskab selle minema. Sel keerulisel viisil saate jätkata vajalike andmete sisestamist.
  • Scanf() mõnes teostuses ei ole "-" skannitud märgikomplektis lubatud.
  • Täpsustaja "%c" loeb voost iga tähemärgi. See tähendab, et see loeb ka eraldaja märki. Eraldaja märgi vahelejätmiseks ja soovitud märgi lugemise jätkamiseks võite kasutada "%1s".
  • Spetsifikaatori "c" kasutamisel on lubatud kasutada laiust "%10c", kuid siis tuleb char tüüpi elementide massiiv edastada muutujana funktsioonile scanf.
  • "%[a-z]" tähendab "kõiki inglise tähestiku väikseid tähti" ja "%[z-a]" tähendab ainult kolme tähemärki: "z", "a", "-". Teisisõnu tähendab märk "-" vahemikku ainult siis, kui see on kahe õiges järjekorras oleva märgi vahel. Kui "-" on avaldise lõpus, alguses või vales märkide järjekorras mõlemal pool seda, siis on see lihts alt sidekriips, mitte vahemik.
C++ kood
C++ kood

Järeldus

Sellega lõpetame scanf C kirjelduse. See on kena mugav funktsioon väikestes programmides töötamiseks ja protseduurilise programmeerimise meetodi kasutamisel. Peamine puudus on aga ettearvamatute vigade arv, mis scanfi kasutamisel tekkida võivad. Seetõttu on scanf C kirjeldus programmeerimisel kõige parem silme ees. Suuremates professionaalsetes projektides kasutatakse iostreame, tänu sellele, et neil on kõrgema taseme võimalused, nad suudavad paremini tabada ja käsitleda vigu ning töötada ka märkimisväärse teabehulgaga. Samuti tuleb märkida, et scanf C venekeelne kirjeldus on saadaval paljudes võrguallikates, samuti selle näitedfunktsiooni vanuse tõttu kasutada. Seetõttu leiate vajadusel alati vastuse teemafoorumitest.

Soovitan: