Opis funkcije Scanf C
Opis funkcije Scanf C

Video: Opis funkcije Scanf C

Video: Opis funkcije Scanf C
Video: Сможете ли вы пройти все линии в свободной зоне весеннего 1-дневного абонемента JRW на второй день⁉ 2024, November
Anonim

V tem članku je funkcija scanf() obravnavana v splošni obliki brez sklicevanja na določen standard, zato so tukaj vključeni podatki iz katerega koli standarda C99, C11, C++11, C++14. Morda v nekaterih standardih funkcija deluje z razlikami od materiala, predstavljenega v članku.

funkcija scanf C - opis

scanf() je funkcija, ki se nahaja v naslovnih datotekah stdio.h(C) in cstdio(C++), znana tudi kot formatiran programski vnos. scanf bere znake iz standardnega vhodnega toka (stdin) in jih pretvori v skladu s formatom, nato jih zapiše v določene spremenljivke. Format - pomeni, da se podatki ob prejemu pretvorijo v določeno obliko. Tako je opisana funkcija scanf C:

scanf("%format", &variable1[, &variable2, […]), kjer so spremenljivke posredovane kot naslovi. Razlog za ta način posredovanja spremenljivk v funkcijo je očiten: kot rezultat dela vrne vrednost, ki kaže na prisotnost napak, zatoedini način za spreminjanje vrednosti spremenljivk je s posredovanjem po naslovu. Zahvaljujoč tej metodi lahko funkcija obdela podatke katere koli vrste.

Nekateri programerji se nanašajo na funkcije, kot sta scanf() ali printf() kot na postopke zaradi analogije z drugimi jeziki.

Scanf omogoča vnos vseh osnovnih jezikovnih tipov: char, int, float, niz itd. V primeru spremenljivk tipa niz ni treba podajati naslovnega znaka - "&", saj je spremenljivka tipa niz matrika, njeno ime pa je naslov prvega elementa matrike v pomnilniku računalnika..

Uporaba C v C++
Uporaba C v C++

Oblika za vnos podatkov ali kontrolni niz

Začnite z ogledom primera funkcije scanf C iz opisa.


include int main() { int x; while (scanf("%d", &x)==1) printf("%d\n", x); vrni 0; //zahteva za sisteme linux }

Format vnosa je sestavljen iz naslednjih štirih parametrov: vrsta %[width][modifiers]. V tem primeru sta znak "%" in vrsta obvezna parametra. To pomeni, da je minimalni format videti takole: “%s”, “%d” in tako naprej.

Na splošno so znaki, ki sestavljajo formatni niz, razdeljeni na:

  • opisovalci oblike - vse, ki se začne z %;
  • presledki ali presledki - to so presledek, tabulator (t), nova vrstica (n);
  • znaki, ki niso presledki.

Funkcija morda ni varna.

Uporabi scanf_s() namesto scanf().

(sporočilo iz Visual Studio)

Opisovalci vrste ali oblike, ali pretvorbeni znaki ali kontrolni znaki

binarna koda
binarna koda

Deklaracija scanf C mora vsebovati vsaj opisnik formata, ki je podan na koncu izrazov, ki se začnejo z "%". Programu pove, katero vrsto podatkov pričakuje pri vnašanju, običajno s tipkovnice. Seznam vseh specificatorjev oblike v spodnji tabeli.

Vrsta pomen
1 %c Program čaka na vnos znakov. Spremenljivka, ki jo želite zapisati, mora biti znaka tipa char.
2 %d Program pričakuje vnos decimalne vrste celega števila. Spremenljivka mora biti vrste int.
3 %i Program pričakuje vnos decimalne vrste celega števila. Spremenljivka mora biti vrste int.
4 %e, %E Program pričakuje, da bo vnesel število s plavajočo vejico (vejica) v eksponentni obliki. Spremenljivka mora biti tipa float.
5 %f Program pričakuje številko s plavajočo vejico (vejica). Spremenljivka mora biti tipa float.
6 %g, %G Program pričakuje številko s plavajočo vejico (vejica). Spremenljivka mora biti tipa float.
7 %a Program pričakuje številko s plavajočo vejico (vejica). Spremenljivka mora biti tipa float.
8 %o Program pričakuje osmiško število. Spremenljivka mora biti vrste int.
9 %s

Program čaka na vnos niza. Niz je nabor vseh znakov do prvega ločilnega znaka. Spremenljivka mora biti vrste niz.

10 %x, %X Program čaka na šestnajstiško število. Spremenljivka mora biti vrste int.
11 %p Spremenljivka pričakuje vnos kazalca. Spremenljivka mora biti vrste kazalca.
12 %n V spremenljivko zapiše celo število, ki je enako številu znakov, ki jih je doslej prebrala funkcija scanf.
13 %u Program prebere nepodpisano celo število. Vrsta spremenljivke mora biti nepodpisano celo število.
14 %b Program čaka na binarno številko. Spremenljivka mora biti vrste int.
15 % Nabor skeniranih znakov. Program čaka na vnos znakov.iz omejenega bazena, navedenega v oglatih oklepajih. scanf bo deloval, dokler so v vhodnem toku znaki iz določenega niza.
16 %% Podpiši "%".

znaki v formatnem nizu

koda C++
koda C++

Simbol zvezdice ()

Zvezdica () je zastavica, ki označuje, da je treba operacijo dodelitve onemogočiti. Takoj za znakom "%" je postavljena zvezdica. Na primer,


scanf("%d%c%d", &x, &y); //prezri znak med dvema celima številkama. scanf("%s%d%s", str, str2); //prezri celo število med dvema nizoma.

To pomeni, da če v konzolo vnesete vrstico "45-20", bo program naredil naslednje:

  1. Spremenljivki "x" bo dodeljena vrednost 45.
  2. Spremenljivki "y" bo dodeljena vrednost 20.
  3. In znak minus (pomišljaj) "-" bo prezrt zahvaljujoč "%c".

Širina (ali širina polja)

To je celo število med znakom "%" in specifikatorjem formata, ki določa največje število znakov za branje v trenutni operaciji branja.


scanf("%20s", str); //preberi prvih 20 znakov iz vhodnega toka

Upoštevati je treba nekaj pomembnih stvari:

  1. scanf se bo končal, če naleti na ločilni znak, tudi če ni štel 20 znakov.
  2. Če je vnesenih več kot 20 znakov, bo samo prvih 20 znakov zapisanih v str.

Modifikatorjivrsta (ali natančnost)

splash koda
splash koda

To so posebne zastavice, ki spreminjajo vrsto podatkov, pričakovanih za vnos. Zastava je določena levo od specifikacije tipa:

  • L ali l (majhno L) Ko se "l" uporablja s specifikacijami d, i, o, u, x, zastavica pove programu, da se pričakuje dolg vnos int. Ko uporabljate "l" s specifikacijo e ali f, zastavica pove programu, da naj pričakuje dvojno vrednost. Uporaba "L" pove programu, da se pričakuje dolg dvojnik. Uporaba "l" s specifikacijama "c" in "s" pove programu, da se pričakujejo dvobajtni znaki, kot je wchar_t. Na primer, "%lc", "%ls", "%l[asd]".
  • h je zastava, ki označuje kratko vrsto.
  • hh - označuje, da je spremenljivka kazalec na vrednost podpisanega ali nepodpisanega znaka. Zastavico lahko uporabite s specifikacijami d, i, o, u, x, n.
  • ll (dve majhni L) - označuje, da je spremenljivka kazalec na vrednost tipa signed long long int ali unsigned long long int. Zastava se uporablja s specifikacijami: d, i, o, u, x, n.
  • j - označuje, da je spremenljivka kazalec na tip intmax_t ali uintmax_t iz naslovne datoteke stdint.h. Uporablja se s specifikacijami: d, i, o, u, x, n.
  • z - označuje, da je spremenljivka kazalec na tip size_t, katerega definicija je v stddef.h. Uporablja se s specifikacijami: d, i, o, u, x, n.
  • t - označuje, da je spremenljivka kazalec na tip ptrdiff_t. Opredelitev nata vrsta je v stddef.h. Uporablja se s specifikacijami: d, i, o, u, x, n.

Bolj jasno, sliko z modifikatorji lahko predstavimo kot tabelo. Takšen opis scanf C za programerje bo bolj jasen.

Specifikatorji in modifikatorji vrste
Specifikatorji in modifikatorji vrste

Drugi znaki

Vsi znaki, ki jih najdemo v formatu, bodo zavrženi. Hkrati je treba opozoriti, da lahko prisotnost presledkov ali ločilnih znakov (nova vrstica, presledek, tabulator) v kontrolnem nizu povzroči drugačno obnašanje funkcije. V eni različici bo scanf() bral brez shranjevanja poljubnega števila ločil, dokler ne naleti na znak, ki ni ločilo, v drugi različici pa presledki (samo oni) ne igrajo vloge in izraz "%d + %d" je enakovredno "% d+%d".

Primer kode C++
Primer kode C++

Primeri

Oglejmo si nekaj primerov, ki vam bodo pomagali razmišljati in bolje razumeti, kako funkcija deluje.


scanf("%3s", str); //če v konzolo vnesete niz "1d2s3d1;3", bo v str scanf("%dminus%d", &x, &y) zapisano samo "1d2"; //minus znaki med dvema številkama bodo zavrženi scanf("%5[0-9]", str); // znaki bodo vneseni v str, dokler ni 5 znakov in znaki so številke od 0 do 9. scanf("%lf", &d); // pričakujte dvojni vnos scanf("%hd", &x); // pričakovano število vrste short scanf("%hu", &y); // pričakujte nepodpisano številko short scanf("lx", &z); //pričakovano število vrste long int

OdSpodnji primeri prikazujejo, kako se pričakovano število spreminja z različnimi simboli.

scanf C - opis za začetnike

Ta razdelek bo uporaben za začetnike. Pogosto morate imeti pri roki ne toliko popoln opis scanf C kot podrobnosti o delovanju funkcije.

  • Ta funkcija je nekoliko zastarela. V knjižnicah različnih različic je več različnih izvedb. Na primer, izboljšana funkcija scanf S C, katere opis lahko najdete na spletnem mestu Microsoft.
  • Število specifikacij v formatu se mora ujemati s številom argumentov, posredovanih funkciji.
  • Elementi vhodnega toka morajo biti ločeni samo z ločilnimi znaki: presledek, tabulator, nova vrstica. Vejica, podpičje, pika itd. - ti znaki niso ločila za funkcijo scanf().
  • Če scanf naleti na ločilni znak, bo vnos ustavljen. Če je za branje več spremenljivk, bo scanf prešel na branje naslednje spremenljivke.
  • Najmanjša nedoslednost v formatu vhodnih podatkov vodi do nepredvidljivih rezultatov programa. No, če se program samo konča z napako. Toda pogosto program še naprej deluje in dela narobe.
  • scanf("%20s …", …); Če vhodni tok presega 20 znakov, bo scanf prebral prvih 20 znakov in prekinil ali prešel na branje naslednje spremenljivke, če je ta podana. V tem primeru bo naslednji klic v scanf nadaljeval branje vhodnega toka od točke, kjer se je ustavilo delo prejšnjega klica scanf. Če ob branju prvih 20znakov, naleti na ločilni znak, bo scanf prekinil ali nadaljeval z branjem naslednje spremenljivke, tudi če za prvo spremenljivko ni prebral 20 znakov. V tem primeru bodo vsi neprebrani znaki pripeti naslednji spremenljivki.
  • Če se nabor skeniranih znakov začne z "^", bo scanf prebral podatke, dokler ne naleti na ločilni znak ali znak iz nabora. Na primer, "%[^A-E1-5]" bo bral podatke iz toka, dokler ne zasledite enega od velikih angleških znakov od A do E ali ene od številk od 1 do 5.
  • Funkcija scanf C, kot je opisano, vrne število, ki je enako uspešnemu številu zapisov v spremenljivke. Če scanf zapiše 3 spremenljivke, bo rezultat uspeha funkcije vrnil številko 3. Če scanf ne more zapisati nobene spremenljivke, bo rezultat 0. In končno, če se scanf iz nekega razloga sploh ne more zagnati, rezultat bo EOF.
  • Če se je funkcija scanf() napačno končala. Na primer, scanf("%d", &x) - pričakovano je bilo število, vendar so bili znaki prejeti kot vhod. Naslednji klic scanf() se bo začel na točki v vhodnem toku, kjer se je končal prejšnji klic funkcije. Da bi premagali to težavo, se je treba znebiti težavnih znakov. To lahko storite na primer s klicem scanf("%s"). To pomeni, da bo funkcija prebrala niz znakov in ga zavrgla. Na ta zapleten način lahko nadaljujete z vnašanjem potrebnih podatkov.
  • V nekaterih izvedbah scanf() "-" ni dovoljen v naboru skeniranih znakov.
  • Označevalnik "%c" prebere vsak znak iz toka. To pomeni, da bere tudi ločilni znak. Če želite preskočiti ločilni znak in nadaljevati branje želenega znaka, lahko uporabite "%1s".
  • Pri uporabi specifikatorja "c" je dovoljena uporaba širine "%10c", vendar je treba nato matriko elementov tipa char posredovati kot spremenljivko funkciji scanf.
  • »%[a-z]« pomeni »vse male črke angleške abecede«, »%[z-a]« pa samo 3 znake: 'z', 'a', '-'. Z drugimi besedami, znak "-" pomeni obseg le, če je med dvema znakoma, ki sta v pravilnem vrstnem redu. Če je "-" na koncu izraza, na začetku ali v napačnem vrstnem redu znakov na obeh straneh, potem je to samo znak vezaj, ne obseg.
koda C++
koda C++

Sklep

To zaključuje opis scanf C. To je prijetna priročna funkcija za delo v majhnih programih in pri uporabi metode proceduralne programiranja. Vendar pa je glavna pomanjkljivost število nepredvidljivih napak, ki se lahko pojavijo pri uporabi scanf. Zato je opis scanf C pri programiranju najbolje imeti pred očmi. V velikih profesionalnih projektih se uporabljajo iostreami, saj imajo zmogljivosti na višji ravni, bolje so sposobni ujeti in obvladovati napake ter delati tudi s precejšnjo količino informacij. Opozoriti je treba tudi, da je opis scanf C v ruščini na voljo v številnih omrežnih virih, pa tudi primeri tegauporaba, zaradi starosti funkcije. Zato, če je potrebno, lahko vedno najdete odgovor na tematskih forumih.

Priporočena: