Scanf C opis funkcije
Scanf C opis funkcije

Video: Scanf C opis funkcije

Video: Scanf C opis funkcije
Video: Elektromagnetski spektar - Hrvoje Mesić (http://prirodopolis.hr) 2024, Maj
Anonim

U ovom članku, funkcija scanf() se razmatra u opštem obliku bez upućivanja na određeni standard, tako da su podaci iz bilo kojeg C99, C11, C++11, C++14 standarda uključeni ovdje. Možda, u nekim standardima, funkcija radi s razlikama od materijala predstavljenog u članku.

scanf C funkcija - opis

scanf() je funkcija koja se nalazi u datotekama zaglavlja stdio.h(C) i cstdio(C++), također poznata kao formatirani programski unos. scanf čita znakove iz standardnog ulaznog toka (stdin) i konvertuje ih prema formatu, a zatim ih upisuje u navedene varijable. Format - znači da se podaci po prijemu konvertuju u određeni oblik. Dakle, funkcija scanf C je opisana:

scanf("%format", &variable1[, &variable2, […]), gdje se varijable prosljeđuju kao adrese. Razlog za ovakav način prosljeđivanja varijabli funkciji je očigledan: kao rezultat rada vraća vrijednost koja ukazuje na prisustvo grešaka, tako dajedini način da promijenite vrijednosti varijabli je prosljeđivanje po adresi. Također, zahvaljujući ovoj metodi, funkcija može obraditi podatke bilo koje vrste.

Neki programeri nazivaju funkcije poput scanf() ili printf() procedurama zbog analogije s drugim jezicima.

Scanf omogućava unos svih osnovnih tipova jezika: char, int, float, string, itd. U slučaju varijabli tipa string, nije potrebno specificirati znak adrese - "&", jer je varijabla tipa string niz, a njeno ime je adresa prvog elementa niza u memoriji računara..

Upotreba C u C++
Upotreba C u C++

Format unosa podataka ili kontrolni niz

Počnite gledajući primjer funkcije scanf C iz opisa.


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

Format unosa se sastoji od sljedeća četiri parametra: tip %[width][modifiers]. U ovom slučaju, znak "%" i tip su obavezni parametri. To jest, minimalni format izgleda ovako: “%s”, “%d” i tako dalje.

Općenito, znakovi koji čine niz formata podijeljeni su na:

  • specifikatori formata - sve što počinje sa %;
  • razdvojni ili razmakni znakovi - to su razmak, tab(t), novi red (n);
  • znakovi osim razmaka.

Funkcija možda nije sigurna.

Koristite scanf_s() umjesto scanf().

(poruka iz Visual Studio)

Specifikatori tipa ili formata, ili znakovi za konverziju, ili kontrolni znakovi

binarni kod
binarni kod

Deklaracija scanf C mora sadržavati barem specifikaciju formata, koji je naveden na kraju izraza koji počinju sa "%". Programu govori o vrsti podataka koje treba očekivati prilikom unosa, obično s tastature. Lista svih specifikacija formata u tabeli ispod.

Vrsta Značenje
1 %c Program čeka na unos karaktera. Varijabla koja se upisuje mora biti karakternog tipa char.
2 %d Program očekuje unos decimalnog broja cjelobrojnog tipa. Varijabla mora biti tipa int.
3 %i Program očekuje unos decimalnog broja cjelobrojnog tipa. Varijabla mora biti tipa int.
4 %e, %E Program očekuje da unese broj s pomičnim zarezom (zarez) u eksponencijalnom obliku. Varijabla mora biti tipa float.
5 %f Program očekuje broj u pokretnom zarezu (zarez). Varijabla mora biti tipa float.
6 %g, %G

Program očekuje broj u pokretnom zarezu (zarez). Varijabla mora biti tipa float.

7 %a Program očekuje broj u pokretnom zarezu (zarez). Varijabla mora biti tipa float.
8 %o Program očekuje oktalni broj. Varijabla mora biti tipa int.
9 %s Program čeka da se unese niz. Niz je skup svih znakova do prvog naiđenog znaka za razdvajanje. Varijabla mora biti tipa string.
10 %x, %X Program čeka na heksadecimalni broj. Varijabla mora biti tipa int.
11 %p Varijabla očekuje unos pokazivača. Varijabla mora biti tipa pokazivača.
12 %n Upisuje u varijablu cjelobrojnu vrijednost jednaku broju znakova do sada pročitanih od strane funkcije scanf.
13 %u Program čita neoznačeni cijeli broj. Tip varijable mora biti cijeli broj bez predznaka.
14 %b Program čeka binarni broj. Varijabla mora biti tipa int.
15 % Skenirani skup znakova. Program čeka da se unesu znakovi.iz ograničenog skupa navedenog između uglastih zagrada. scanf će raditi sve dok ima znakova iz navedenog skupa na ulaznom toku.
16 %% Potpis "%".

Karakteri u nizu formata

C++ kod
C++ kod

Simbol zvjezdice ()

Zvjezdica () je zastavica koja označava da operacija dodjeljivanja treba biti potisnuta. Odmah iza znaka "%" stavlja se zvjezdica. Na primjer,


scanf("%d%c%d", &x, &y); //zanemari znak između dva cijela broja. scanf("%s%d%s", str, str2); //zanemarimo cijeli broj između dva niza.

To jest, ako unesete red "45-20" u konzolu, program će uraditi sljedeće:

  1. Varijabli "x" će biti dodijeljena vrijednost 45.
  2. Varijabli "y" će biti dodijeljena vrijednost 20.
  3. A znak minus (crtica) "-" će biti zanemaren zahvaljujući "%c".

Širina (ili širina polja)

Ovo je cijeli broj između znaka "%" i specifikacije formata koji specificira maksimalan broj znakova za čitanje u trenutnoj operaciji čitanja.


scanf("%20s", str); //pročitajte prvih 20 znakova iz ulaznog toka

Postoji nekoliko važnih stvari koje treba imati na umu:

  1. scanf će se prekinuti ako naiđe na znak za razdvajanje, čak i ako nije brojao 20 znakova.
  2. Ako se unese više od 20 znakova, samo prvih 20 znakova će biti upisano u str.

Modifikatoritip (ili preciznost)

splash code
splash code

Ovo su posebne zastavice koje modificiraju tip podataka koji se očekuje za unos. Zastava je navedena lijevo od specificatora tipa:

  • L ili l (mali L) Kada se "l" koristi sa specifikacijama d, i, o, u, x, zastavica govori programu da se očekuje dug int unos. Kada koristite "l" sa specifikacijom e ili f, zastavica govori programu da treba očekivati dvostruku vrijednost. Upotreba "L" govori programu da se očekuje dugo duplo. Upotreba "l" sa specifikacijama "c" i "s" govori programu da se očekuju dvobajtni karakteri kao što je wchar_t. Na primjer, "%lc", "%ls", "%l[asd]".
  • h je zastavica koja označava kratki tip.
  • hh - označava da je varijabla pokazivač na vrijednost znakova sa znakom ili bez predznaka. Zastava se može koristiti sa specifikacijama d, i, o, u, x, n.
  • ll (dva mala L) - označava da je varijabla pokazivač na vrijednost tipa signed long long int ili unsigned long long int. Zastava se koristi sa specifikacijama: d, i, o, u, x, n.
  • j - označava da je varijabla pokazivač na tip intmax_t ili uintmax_t iz datoteke zaglavlja stdint.h. Koristi se sa specifikacijama: d, i, o, u, x, n.
  • z - označava da je varijabla pokazivač na tip size_t, čija je definicija u stddef.h. Koristi se sa specifikacijama: d, i, o, u, x, n.
  • t - označava da je varijabla pokazivač na tip ptrdiff_t. Definicija uključenaovaj tip je u stddef.h. Koristi se sa specifikacijama: d, i, o, u, x, n.

Josnije, slika sa modifikatorima može biti predstavljena kao tabela. Takav opis scanf-a C za programere će biti jasniji.

Specifikatori i modifikatori tipa
Specifikatori i modifikatori tipa

Drugi likovi

Svi znakovi koji se nađu u formatu bit će odbačeni. Istovremeno, treba napomenuti da prisustvo razmaka ili znakova za razdvajanje (novi red, razmak, tab) u kontrolnom nizu može dovesti do drugačijeg ponašanja funkcije. U jednoj verziji, scanf() će čitati bez spremanja bilo kojeg broja separatora sve dok ne naiđe na znak koji nije separator, au drugoj verziji razmaci (samo oni) ne igraju ulogu i izraz "%d + %d" je ekvivalentno "% d+%d".

Primjer C++ koda
Primjer C++ koda

Primjeri

Pogledajmo neke primjere koji će vam pomoći da razmislite i bolje shvatite kako funkcija funkcionira.


scanf("%3s", str); //ako unesete string "1d2s3d1;3" u konzolu, samo "1d2" će biti zapisano u str scanf("%dminus%d", &x, &y); //minus znakovi između dva broja će biti odbačeni scanf("%5[0-9]", str); // znakovi će se unositi u str dok ne bude 5 znakova, a znakovi su brojevi od 0 do 9. scanf("%lf", &d); //očekujte dvostruki ulaz scanf("%hd", &x); //očekivani broj tipa short scanf("%hu", &y); //očekujte nepotpisani broj short scanf("lx", &z); //očekivani broj tipa long int

OdPrimjeri ispod pokazuju kako se očekivani broj mijenja upotrebom različitih simbola.

scanf C - opis za početnike

Ovaj odjeljak će biti koristan za početnike. Često morate imati pri ruci ne toliko kompletan opis scanf-a C koliko detalje o tome kako funkcija funkcionira.

  • Ova funkcija je pomalo zastarjela. Postoji nekoliko različitih implementacija u bibliotekama različitih verzija. Na primjer, poboljšana funkcija scanf S C, čiji opis se može naći na web stranici Microsofta.
  • Broj specifikacija u formatu mora odgovarati broju argumenata proslijeđenih funkciji.
  • Elementi ulaznog toka moraju biti odvojeni samo znakovima za razdvajanje: razmak, tabulator, novi red. Zarez, tačka i zarez, tačka, itd. - ovi znakovi nisu separatori za funkciju scanf().
  • Ako scanf naiđe na znak za razdvajanje, unos će biti zaustavljen. Ako postoji više od jedne varijable za čitanje, scanf će preći na čitanje sljedeće varijable.
  • Najmanja nedosljednost u formatu ulaznih podataka dovodi do nepredvidivih rezultata programa. Pa, ako se program samo završi s greškom. Ali često program nastavlja da radi i radi pogrešno.
  • scanf("%20s …", …); Ako ulazni tok prelazi 20 znakova, tada će scanf pročitati prvih 20 znakova i ili prekinuti ili preći na čitanje sljedeće varijable, ako je ona specificirana. U ovom slučaju, sljedeći poziv na scanf će nastaviti čitanje ulaznog toka od tačke gdje je rad prethodnog poziva na scanf zaustavljen. Ako pri čitanju prvih 20karaktera, naiđe se na znak za razdvajanje, scanf će prekinuti ili nastaviti čitanje sljedeće varijable, čak i ako nije pročitao 20 znakova za prvu varijablu. U ovom slučaju, svi nepročitani znakovi će biti pridruženi sljedećoj varijabli.
  • Ako skup skeniranih znakova počinje sa "^", tada će scanf čitati podatke sve dok ne naiđe na znak za razgraničenje ili znak iz skupa. Na primjer, "%[^A-E1-5]" će čitati podatke iz toka sve dok se ne naiđe jedan od velikih engleskih znakova od A do E ili jedan od brojeva od 1 do 5.
  • Funkcija scanf C, kao što je opisano, vraća broj jednak uspješnom broju upisa u varijable. Ako scanf zapiše 3 varijable, tada će rezultat uspjeha funkcije vratiti broj 3. Ako scanf ne može upisati nijednu varijablu, tada će rezultat biti 0. I, konačno, ako scanf iz nekog razloga uopće nije mogao započeti, rezultat će biti EOF.
  • Ako je funkcija scanf() neispravno završila. Na primjer, scanf("%d", &x) - očekivao se broj, ali su znakovi primljeni kao ulaz. Sljedeći poziv scanf() će započeti na mjestu u ulaznom toku gdje je završio prethodni poziv funkcije. Da biste prevazišli ovaj problem, potrebno je da se riješite problematičnih karaktera. Ovo se može učiniti, na primjer, pozivanjem scanf("%s"). To jest, funkcija će pročitati niz znakova i odbaciti ga. Na ovaj lukav način možete nastaviti unositi potrebne podatke.
  • U nekim implementacijama scanf(), "-" nije dozvoljeno u skeniranom skupu znakova.
  • Specifikator "%c" čita svaki znak iz toka. To jest, takođe čita znak za razdvajanje. Da preskočite znak za razdvajanje i nastavite čitati željeni znak, možete koristiti "%1s".
  • Kada se koristi specifikacija "c", dozvoljeno je koristiti širinu "%10c", ali tada se niz elemenata tipa char mora proslijediti kao varijabla funkciji scanf.
  • “%[a-z]” znači “sva mala slova engleske abecede”, a “%[z-a]” znači samo 3 znaka: ‘z’, ‘a’, ‘-’. Drugim riječima, znak "-" znači raspon samo ako se nalazi između dva znaka koja su u ispravnom redoslijedu. Ako je "-" na kraju izraza, na početku ili u pogrešnom redoslijedu znakova s obje strane, onda je to samo znak crtice, a ne raspon.
C++ kod
C++ kod

Zaključak

Ovo završava opis scanf-a C. Ovo je zgodna zgodna karakteristika za rad u malim programima i kada se koristi metod proceduralnog programiranja. Međutim, glavni nedostatak je broj nepredvidivih grešaka koje se mogu pojaviti pri korištenju scanf-a. Stoga je opis scanf-a C pri programiranju najbolje držati pred očima. U velikim profesionalnim projektima koriste se iostreamovi, zbog činjenice da imaju mogućnosti višeg nivoa, bolje su u stanju uhvatiti i rukovati greškama, a također rade sa značajnim količinama informacija. Također treba napomenuti da je opis scanf C na ruskom dostupan na mnogim mrežnim izvorima, kao i primjeri za njegakorištenje, zbog starosti funkcije. Stoga, ako je potrebno, uvijek možete pronaći odgovor na tematskim forumima.

Preporučuje se: