Opis funkcije Scanf C
Opis funkcije Scanf C

Video: Opis funkcije Scanf C

Video: Opis funkcije Scanf C
Video: SAJFER - KOKAINA (Miami Yacine - Kokaina Remix) Official Visual Video 2017 2024, Svibanj
Anonim

U ovom članku, funkcija scanf() se razmatra u općem 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 funkcionira 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 pretvara ih u skladu s formatom, a zatim ih zapisuje u navedene varijable. Format - znači da se podaci po primitku pretvaraju 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čit: kao rezultat rada vraća vrijednost koja ukazuje na prisutnost grešaka, pajedini način za promjenu 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() procedure zbog analogije s drugim jezicima.

Scanf omogućuje unos svih osnovnih tipova jezika: char, int, float, string, itd. U slučaju varijabli tipa string, nije potrebno specificirati adresni znak - "&", budući da je varijabla tipa string niz, a naziv joj je adresa prvog elementa niza u memoriji računala..

Korištenje C u C++
Korištenje 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); vrati 0; //zahtjev za linux sustave }

Format unosa sastoji se od sljedeća četiri parametra: tip %[width][modifiers]. U ovom slučaju, znak "%" i tip su obvezni 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 s %;
  • razdvojni ili razmakni znakovi - to su razmak, tab(t), novi redak (n);
  • znakovi osim razmaka.

Funkcija možda nije sigurna.

Upotrijebite scanf_s() umjesto scanf().

(poruka iz Visual Studio)

Specifikatori vrste ili formata, ili znakovi za pretvorbu, ili kontrolni znakovi

binarni kod
binarni kod

Deklaracija scanf C mora sadržavati barem specifikaciju formata, koji je naveden na kraju izraza koji počinje s "%". Programu govori kakvu vrstu podataka treba očekivati prilikom unosa, obično s tipkovnice. Popis svih specifikacija formata u tablici ispod.

Vrsta Značenje
1 %c Program čeka na unos znakova. Varijabla koja se upisuje mora biti tipa znakova 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 unos broja s pomičnim zarezom (zarez) u eksponencijalnom obliku. Varijabla mora biti tipa float.
5 %f Program očekuje broj s pomičnim zarezom (zarez). Varijabla mora biti tipa float.
6 %g, %G

Program očekuje broj s pomičnim zarezom (zarez). Varijabla mora biti tipa float.

7 %a Program očekuje broj s pomičnim zarezom (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 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 koje je do sada pročitala funkcija scanf.
13 %u Program čita neoznačeni cijeli broj. Vrsta varijable mora biti cijeli broj bez predznaka.
14 %b Program čeka binarni broj. Varijabla mora biti tipa int.
15 % Skenirani skup znakova. Program čeka na unos znakova.iz ograničenog skupa navedenog između uglastih zagrada. scanf će raditi sve dok postoje znakovi iz navedenog skupa na ulaznom toku.
16 %% Potpis "%".

Znakovi u nizu formata

C++ kod
C++ kod

Simbol zvjezdice ()

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


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

To jest, ako unesete redak "45-20" u konzolu, program će učiniti sljedeće:

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

Širina (ili širina polja)

Ovo je cijeli broj između znaka "%" i specifikacije formata koji određuje maksimalni 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 će prvih 20 znakova biti upisano u str.

Modifikatoritip (ili preciznost)

splash kod
splash kod

Ovo su posebne zastavice koje mijenjaju vrstu podataka koji se očekuju 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. Korištenje "L" govori programu da se očekuje dugo dvostruko. Upotreba "l" sa specifikacijama "c" i "s" govori programu da se očekuju dvobajtni znakovi poput wchar_t. Na primjer, "%lc", "%ls", "%l[asd]".
  • h je zastava koja označava kratki tip.
  • hh - označava da je varijabla pokazivač na vrijednost znakova s predznakom 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 naovaj tip je u stddef.h. Koristi se sa specifikacijama: d, i, o, u, x, n.

Jasnije, slika s modifikatorima može se predstaviti kao tablica. Takav će opis scanf-a C za programere biti jasniji.

Specifikatori i modifikatori tipa
Specifikatori i modifikatori tipa

Drugi znakovi

Svi znakovi koji se nađu u formatu bit će odbačeni. Istodobno, treba napomenuti da prisutnost razmaka ili znakova za razdvajanje (novi redak, razmak, tab) u kontrolnom nizu može dovesti do različitog 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 niz "1d2s3d1;3" u konzolu, samo će "1d2" biti zapisano u str scanf("%dminus%d", &x, &y); //minus znakovi između dva broja bit će 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 kratki scanf("lx", &z); //očekivani broj tipa long int

OdPrimjeri u nastavku 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 potpuni opis scanf-a C koliko pojedinosti o tome kako funkcija funkcionira.

  • Ova značajka je pomalo zastarjela. Postoji nekoliko različitih implementacija u knjižnicama različitih verzija. Na primjer, poboljšana funkcija scanf S C, čiji se opis može pronać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 redak. Zarez, točka-zarez, toč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 prijeći na čitanje sljedeće varijable.
  • Najmanja nedosljednost u formatu ulaznih podataka dovodi do nepredvidivih rezultata programa. Pa, ako program jednostavno završi s greškom. Ali često program nastavlja raditi i čini to pogrešno.
  • scanf("%20s …", …); Ako ulazni tok prelazi 20 znakova, tada će scanf pročitati prvih 20 znakova i ili prekinuti ili prijeći na čitanje sljedeće varijable, ako je ona navedena. U tom slučaju, sljedeći poziv na scanf nastavit će čitati ulazni tok od točke gdje je prestao rad prethodnog poziva na scanf. Ako čitajući prvih 20znakova, naiđe se na znak za razgraničenje, 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 bit će pridruženi sljedećoj varijabli.
  • Ako skup skeniranih znakova počinje s "^", tada će scanf čitati podatke sve dok ne naiđe na znak za razgraničenje ili znak iz skupa. Na primjer, "%[^A-E1-5]" čitat će podatke iz toka sve dok se ne naiđe na 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 uspješnosti funkcije vratiti broj 3. Ako scanf ne može zapisati nijednu varijablu, tada će rezultat biti 0. I, konačno, ako se scanf iz nekog razloga uopće nije mogao pokrenuti, rezultat će biti EOF.
  • Ako je funkcija scanf() završila pogrešno. Na primjer, scanf("%d", &x) - očekivao se broj, ali su znakovi primljeni kao ulaz. Sljedeći poziv scanf() počet će na točki u ulaznom toku gdje je završio prethodni poziv funkcije. Da biste prevladali ovaj problem, potrebno je riješiti se problematičnih likova. To se može učiniti, na primjer, pozivom scanf("%s"). To jest, funkcija će pročitati niz znakova i baciti ga. Na ovaj lukav način možete nastaviti unositi potrebne podatke.
  • U nekim implementacijama scanf(), "-" nije dopušteno u skeniranom skupu znakova.
  • Specifikator "%c" čita svaki znak iz toka. To jest, također čita znak za razdvajanje. Da biste preskočili znak za razdvajanje i nastavili čitati željeni znak, možete koristiti "%1s".
  • Kada se koristi specifikacija "c", dopušteno 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 koji 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 značajka za rad u malim programima i kada koristite metodu proceduralnog programiranja. Međutim, glavni nedostatak je broj nepredvidivih pogreš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še razine, bolje su u stanju uhvatiti i rukovati pogreš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 njegovi primjerikorištenje, zbog starosti funkcije. Stoga, ako je potrebno, uvijek možete pronaći odgovor na tematskim forumima.

Preporučeni: