Kako podesiti pametne telefone i računare. Informativni portal
  • Dom
  • Programi
  • Čitanje datoteke koristeći scanf u c. Istraživanje i korištenje funkcija Printf () i Scanf ().

Čitanje datoteke koristeći scanf u c. Istraživanje i korištenje funkcija Printf () i Scanf ().

] SCANF #include int scanf (format-string [[, argument ...]]); char * format-string. format kontrolnog niza. Opis. Scanf funkcija čita podatke iz standardni stream stdin na lokaciju specificiranu argumentima. Svaki argument mora biti pokazivač na vrijednost s tipom koji odgovara tipu navedenom u nizu formata. Niz formata kontroliše transformacije polja za unos. Ovaj niz može sadržavati sljedeće: "Whitespace" znakove, tj. razmak "", tabulatori \ t, nova linija"\ n". Za scanf funkcije razmak definira čitanje, ali bez pamćenja, svih unesenih narednih znakova razmaka do prvog znaka bez razmaka. Dok kucate, jedan razmak u nizu formata odgovara bilo kojem broju, uključujući 0, ili bilo kojoj kombinaciji znakova razmaka. Bilo koji kontrolni znak osim razmaka i znaka za postotak%. Zatim se ovaj simbol za scanf funkciju određuje čitanjem, ali bez pohranjivanja odgovarajućih kontrolnih simbola. Ako je sljedeći znak u ne odgovara kontrolnim znakovima, tada scanf izlazi. Specifikacija formata unesena sa znakom %. U ovom slučaju, scanf čita i pretvara unesene znakove u unesene vrijednosti. ovog tipa, a vrijednosti su određene odgovarajućim argumentima sa liste argumenata. Niz formata se čita s lijeva na desno. Pretpostavlja se da su znakovi izvan specifikacije formata u skladu sa nizom znakova u stdin toku; ovi podudarni znakovi u stdin-u se skeniraju, ali se ne pamte. Ako je znak u stdin u sukobu sa stringom formata, scanf izlazi. Ovaj konfliktni znak ostaje u stdin jer se ne može pročitati. Kada se naiđe na prvu specifikaciju formata, tada se vrijednost prvog polja za unos pretvara u skladu sa specifikacijom formata i pohranjuje na lokaciji specificiranoj prvim argumentom. Prema drugoj specifikaciji formata, drugo polje unosa se konvertuje i pohranjuje drugim argumentom; i tako dalje do kraja niza formatiranja. Polje za unos je ograničeno prvim znakom "razmaka" ili prvim znakom koji se ne može konvertirati u navedeni format, ili slučajem postignuća polja širine to je prvo. Ako je za odabranu specifikaciju formata dato više argumenata nego što je potrebno, dodatni argumenti se zanemaruju. Specifikacija formata ima sljedeći oblik. % <.precision><{F:N:h:I}>... Svako polje u BOM formatu je poseban znak ili broj koji izražava zasebnu opciju formata. Znak tipa koji se pojavljuje nakon posljednjeg opciono polje format, definira tip polja za unos kao karakter, niz ili broj. Najjednostavniji format BOM sadrži samo znak za procenat i simbol tipa (na primjer,% S). Svako polje specifikacije formata je opisano u nastavku. Ako iza znaka postotka% slijedi znak koji nije kontrolni znak formata, tada se ovaj znak i znakovi koji slijede, do sljedećeg znaka% tretiraju kao regularni niz znakova, tj. sekvenca koju treba uneti. Na primjer, da unesete znak znaka %, koristite %%. Zvjezdica (*) iza znaka % potiskuje oznaku sljedećeg polja za unos, koje je specificirano kao polje specificirano po tipu. Ovo polje se skenira, ali se ne pamti. Widht je pozitivan decimalni cijeli broj i kontrolira maksimalan broj znakova koji se čitaju iz stdin. Samo oni znakovi koji ne prelaze širinu se transformiraju i pamte odgovarajućim argumentom. Ako ima razmaka u širini, tj. razmak, tabulator ili karakter novog reda, oni se ne konvertuju u odabrani format dok se ne dostigne širina. Opcijski F i N prefiksi ne poštuju standardnu ​​konvenciju adresiranja korištenih memorijskih modela. F može biti prefiks za argument koji ukazuje na udaljeni objekat; i N do najbližeg objekta. Opcioni prefiks l označava da se koristi duga verzija; a prefiks h označava upotrebu kratke verzije. Odgovarajući argument ukazuje na dugi ili dvostruki objekt (koristeći prefiks l) ili kratak objekt (koristeći prefiks h). Modifikatori l i h mogu se koristiti zajedno sa tipovima znakova d, i, o, x, u. Modifikator l se također može koristiti sa znakovima tipa e i f. Ako je naveden bilo koji drugi tip, modifikatori l i h se zanemaruju. Simboli tipa i njihova značenja opisani su u Tabeli R.4. Tabela R.4 Tipovi znakova scanf-a PREDLOŽENI ZNAK VRSTA ULAZA ARGUMENT d decimalni cjelobrojni pokazivač na int. D decimalni cjelobrojni pokazivač na long. o oktalni cijeli broj pokazivač na int. O oktalni cijeli broj pokazivač na long. x je heksadecimalni pokazivač na int. cijeli broj X heksadecimalni pokazivač na long. cijeli broj i decimalni, osmi je pokazivač na int. mjera ili heksadecimalni cijeli broj I decimalni, oktalni pokazivač na long. spojeni ili heksadecimalni cijeli broj u unsigned decimalni pokazivač na neoznačeni cijeli broj. U neoznačeni decimalni pokazivač na duži cijeli broj bez predznaka. e je vrijednost s pomičnim zarezom, pokazivač na float f-tu zarezu, koji sadrži neobavezni znak ("+", "-"), jednu ili više decimalnih cifara, obično sadrži decimalni zarez i eksponent ("e "," E"), koji se piše iza predpisane vrijednosti cijelog broja. c karakter. Pokazivač karaktera na char Znakovi za razmak, tab ili novi red, takozvani "razmak", koji se obično zanemaruju, čitaju se kada je ovaj tip specificiran. % 1s se koristi za čitanje sljedećeg znaka koji nije razmak. s string. pokazivač na niz znakova dovoljno velik za polje za unos zajedno sa nultim terminatorom "\ 0" koji se automatski pojavljuje. n čitanje na ulazu pokazivača na int, u iz toka ili iz kojeg je bafer upisan, ali se uspješno računa. znakove iz toka ili bafera, sve do i uključujući one specificirane u scanf pozivu. p vrijednost u pokazivaču obrasca na far- xxxx: yyyy, gdje je grupa podataka. cifre x i y su velike heksadecimalne cifre. Kada čitate nizove koji nisu razgraničeni znakovima razmaka, skup znakova u uglastim zagradama mora se zamijeniti nizom tipa s. Odgovarajuće polje za unos se čita do prvog znaka koji nije sadržan u skupu znakova omeđenog uglastim zagradama. Ako je prvi znak u ovom skupu karet (^), rezultat se čuva: polje za unos se čita do prvog znaka koji nije uključen u ovaj skup znakova. Za pamćenje niza bez nultog znaka "\ 0", koristi se specifikacija% nc, gdje je n decimalni cijeli broj. U ovom slučaju, tip karaktera s definira argument koji ukazuje na niz znakova. Sljedećih n znakova se čitaju iz ulaznog toka na navedenu lokaciju i nulti znak se ne upisuje. Funkcija scanf skenira znak po znak za svako polje unosa. Može završiti čitanje jednog polja kada dostigne znak razmaka, ako se dosegne bilo koje polje širine; ili se sljedeći ulazni znak ne može konvertirati u navedeni format; ili je sljedeći znak u sukobu sa svojim odgovarajućim znakom u kontrolna linija format; ili nedostaje sljedeći znak u odabranom skupu znakova. Kada se dogodi diktirani proces završetka čitanja, sljedeće polje za unos se razmatra od prvog konfliktnog karaktera. Ovaj znak, ako postoji, tretira se kao nepročitani, bilo kao prvi znak sljedećeg polja za unos, ili kao prvi znak u narednim čitanjima iz stdin toka. Povratna vrijednost. Ova funkcija vraća broj uspješno konvertiranih i dodijeljenih polja. Povratna vrijednost ne sadrži broj polja koja su pročitana, ali nisu dodijeljena. EOF se vraća kada pokušavate pročitati kraj datoteke. Povratna vrijednost 0 označava da nema dodijeljenih polja. Vidite i fscanf, printf, sscanf, vfprintf, vprintf, vsprintf. Primjer 1. #include int i; float fp; char c, s; scanf ("% d% f% c% s", & i, & fp, & c, s); / * unos raznih podataka * /. Primjer 2. #include main () / * pretvoriti heksadecimalni ** ili oktalni cijeli broj u ** decimalni cijeli broj * / (int numassigned, val; pintf ("Unesite heksadecimalni ili oktalni #, ili 00 u guit: \ n"); uradi (printf ("# = "); numassigned = scanf ("% i ", & val); printf (" Decimal # =% i \ n ", nal);) while (val && numassigned); / * kraj petlje ako je ulazna vrijednost 00 , ili ako scanf ne može dodijeliti polje * /.) Tada će izlaz biti sljedeći. Unesite heksadecimalni ili oktalni #, ili 00 za guit: # = 0xf Decimalni # = 15 # = 0100 Decimalni # = 64 # = 00 Decimalni # = 0.

Kako je dobro kada su svi podaci dati, a ništa ne treba unositi. Ali, vjerujte mi, to se praktično ne dešava. Sjetite se škole, kada ste mjerili određene stvari, a zatim ste dobivene vrijednosti ubacivali u potrebne formule.

scanf

U jeziku C, pored printf izlazne funkcije, postoji i scanf funkcija za unos. Evo scanf funkcije upravo sada i mi ćemo detaljnije pogledati:

int i;
scanf ("% d", & i);

Izgleda vrlo slično funkciji printf. Također dostupno u dvostruki navodnici specifikacija formata, ali razlika je u drugom dijelu funkcije. Primijetili ste pojavu znaka (&)? Dakle, ovaj znak znači uzimanje adrese. Odmah ću objasniti zašto je to potrebno.

Unesenu vrijednost moramo napisati ne negdje tamo, već tačno na adresi na kojoj se nalazi naša varijabla. One. unsigned (&) naša unesena vrijednost će ići na sva mjesta osim na ono što nam je potrebno. Stoga, kad god trebate unijeti vrijednosti sa tastature, stavite znak adrese (&) ispred varijable.

Specifikatori formata

Pa sad idemo preko specifikacije formata:
  1. % d - čitanje cijelog broja
  2. int i;
    scanf ("% d", & i);

  3. % o - čitanje oktalni broj
  4. int i;
    scanf ("% o", & i);

  5. % x - čitanje heksadecimalnog broja
  6. int i;
    scanf ("% x", & i);

  7. % e (% f) - čitanje realnog broja
  8. float t;
    scanf ("% f", & t);

  9. % s - čitanje karaktera
  10. char ch;
    scanf ("% c", & ch);

  11. % s - red za čitanje
  12. char * str ;;
    scanf ("% s", str);

    Nemojte se još baviti radom sa žicama. Zašto nema znakova preuzimanja adrese? Ovu temu ćemo razmotriti malo kasnije.

Operacije poređenja

Računar je prvobitno instaliran boolean logika, tj. sve je izgrađeno na 0 i 1. Ako ne razumijete o čemu se radi, onda pogledajte film Matrix, gdje se svaki zeleni screen saver sastoji samo od ova dva magična broja.

Naravno, 0 i 1 su dobri, ali nam je potreban logički smisao, dakle logičke operacije 0 je LAŽ, a 1 je TAČNO. Ovi koncepti TAČNO i LAŽNO su usko povezani operacije poređenja... Za početak, evo svih vrsta operacija poređenja:

U osnovi, najčešća greška koju prave početnici je da pomiješaju operaciju dodjele (=). operacija poređenja(==). To su potpuno različite stvari. Ali na početku kodiranja svi imaju greške baš po ovoj osnovi, stoga budite oprezni.

Funkcije printf () i scanf () nam daju mogućnost interakcije s programom. Zovemo ih I/O funkcijama. Ovo nisu jedine funkcije koje možemo koristiti za unos i izlaz podataka u C programima, ali su najsvestranije. Ove funkcije su uključene u opis jezika C i date su u biblioteci stdio.h. Tipično, printf () i scanf () rade na isti način - svaki koristi kontrolni niz i listu argumenata. Prvo ćemo pogledati kako printf () radi, a zatim scanf ().

Format

Tip prikazane informacije

decimalni cijeli broj

jedan lik

niz znakova

eksponencijalna notacija

broj s pomičnim zarezom, decimalni zapis

koristi se umjesto% f ili% e

neoznačeni decimalni cijeli broj

neoznačeni oktalni cijeli broj

heksadecimalni cijeli broj bez predznaka

Instrukcije koje se daju printf () kada želimo da ispišemo neku varijablu zavise od toga koji tip te varijable. Na primjer, kada se ispisuje cijeli broj, format je% d, a kada se ispisuje znak, to je% c. Formati su navedeni u tabeli.

Sada da vidimo kako se ovi oblici primjenjuju:

/* pečat */

#include

#define PI 3.14159

int broj = 2003;

printf ("Internet univerzitet informacionih tehnologija otvoren u% d godine \ n", broj);

printf ("Vrijednost pi je% f. \ n", PI);

Format naveden prilikom poziva funkcije printf () je sljedeći:

printf (Kontrolni niz, arg1, arg2, _);

argument 1, argument 2, itd. su parametri za štampanje, koji mogu biti varijable, konstante ili čak izrazi izračunato prije štampanja.

Kontrolni niz je niz znakova koji označava kako bi se parametri trebali ispisati. Na primjer, u operater

printf ("% d učenika je ocijenjeno% f. \ n",

kontrolni niz je fraza pod navodnicima, a broj i z su argumenti ili in u ovom slučaju vrijednosti dvije varijable.

Vidimo da kontrolna linija sadrži dvije različite vrste informacija:

    Znakovi štampani tekstualno.

    Identifikatori podataka, tzv specifikacije konverzije .

Svaki argument sa liste nakon kontrolnog niza mora imati jedan specifikacija konverzije... Ako trebate odštampati bilo koju frazu, onda nema potrebe za korištenjem specifikacija konverzije; ako trebate samo ispisati podatke, možete i bez korištenja komentara. Stoga, svaki od operateri u nastavku su potpuno prihvatljivi:

printf ("Ova knjiga nije jako skupa! \ n");

printf ("% c% d \ n", "$", cijena);

Ako trebate odštampati sam simbol %, kompajler će ga zamijeniti kao grešku specifikacija konverzije... Izlaz iz ove situacije je prilično jednostavno rješenje - upišite dva% znakova za redom.

Na primjer:

printf ("Samo % d %% populacije može samostalno učiti! \ n", i);

Rezultat programa će izgledati ovako:

Samo 5% stanovništva može samostalno da studira!

Možemo proširiti osnovnu definiciju specifikacije konverzije postavljanjem modifikatora između znaka % i znaka koji specificira tip konverzije. Kada koristite više modifikatora u isto vrijeme, oni moraju biti navedeni redoslijedom kojim su navedeni u tabeli.

Modifikatori

Značenje

Argument će biti ispisan sa pozicije lijeve margine zadata širina... Obično se štampanje argumenta završava na krajnjoj desnoj poziciji margine. Primjer:% -10

niz brojeva

Određuje minimalnu širinu polja. Veće polje će se koristiti ako odštampani broj ili linija ne stane u originalno polje Primer:% 4d

niz brojeva

Određuje preciznost: za tipove podataka s pomičnim zarezom, broj cifara koje treba odštampati desno od decimalnog zareza; za nizove znakova - maksimalan broj znakova za ispis Primjer:

% 4.2f (dvije decimalne cifre za polje od četiri znaka)

Odgovarajuća stavka ima dugačak tip, ne int Primjer:% ld

printf ("/% d / \ n", 135);

printf ("/% 2d / \ n", 135);

printf ("/% 10d / \ n", 135);

printf ("/% - 10d / \ n", 135);

Prvi specifikacija konverzije% d ne sadrži modifikatore. Ovo je takozvani podrazumevani izbor, odnosno rezultat radnje kompajlera ako mu niste dali nikakve dodatne instrukcije. Drugi specifikacija konverzije-% 2d. Označava da širina polja treba da bude 2, ali pošto se broj sastoji od tri znamenke, polje se automatski proširuje na potrebnu veličinu. Sljedeći specifikacija% 10d označava širinu polja 10. Zadnje specifikacija% -10d također označava širinu polja od 10, a znak - uzrokuje pomak cijelog broja ulijevo.

Funkcija scanf () je rutina unosa opće namjene koji čita podatke iz stdin toka. Ona može pročitati podatke svih osnovne vrste i automatski ih konvertuje u željeni interni format. Ako je printf () vršio unos umjesto izlaza, mogao bi se nazvati analogom scanf ().

Kontrolni niz na koji ukazuje format sastoji se od tri vrste znakova:

  • Specifikatori formata
  • Posebni simboli
  • Ostali znakovi (nisu posebni)

Specifikatori formata prate znak postotka i govore scanf-u () koju vrstu podataka da čita sljedeće. Kodovi specifikacija su prikazani u tabeli.

Tabela: Format kodova za scanf ()
Šifra Značenje
%Sa Brojite jedan znak
% d
% i Razmislite decimalni broj ceo tip
% e
% f Pročitajte broj u pokretnom zarezu
% g Pročitajte broj u pokretnom zarezu
%O Brojite oktalni broj
% s Pročitaj liniju
%X Pročitaj heksadecimalni broj
%R Pokazivač čitanja
% n Prihvata cjelobrojnu vrijednost jednaku broju znakova pročitanih do trenutnog trenutka
% u Čita cijeli broj bez predznaka
% Traži skup znakova
%% Čita % znak

Na primjer, % s čita string, a % d čita cjelobrojnu varijablu.

Niz formata se čita s lijeva na desno, mapirajući između kodova formata i argumenata iz liste argumenata.

Posebni znakovi u kontrolnom nizu uzrokuju da scanf () preskoči jedan ili više njih specijalni znakovi u ulaznom toku. Posebni znakovi su razmak, tabulator ili novi red. Jedan specijalni znak na kontrolnoj liniji uzrokuje da scanf () čita, bez pamćenja, bilo koji broj (uključujući nulu) uzastopnih specijalnih znakova iz ulaznog toka, sve dok se ne naiđe na nespecijalni znak.

Dostupnost regularnog karaktera uzrokuje da scanf () pročita i odbaci odgovarajući znak. Na primjer, "% d,% d" uzrokuje da scanf () pročita cijeli broj, pročita i odbaci zarez, a zatim pročita drugi cijeli broj. Ako se navedeni znak ne pronađe u ulaznom toku, scanf () se zaustavlja.

Sve varijable koje se koriste za primanje vrijednosti pomoću funkcije scanf () moraju se tražiti po njihovim adresama. To znači da svi argumenti funkcije moraju biti pokazivači na varijable. Dakle, C omogućava prolazak po referenci, a to omogućava funkciji da promijeni sadržaj argumenta.

Scanf ("% d", & count);

Nizovi se čitaju u nizove znakova, a ime niza, bez ikakvog pokazivača, je adresa prvog elementa u nizu. Stoga, da biste pročitali string u nizu znakova adrese, možete koristiti naredbu

Scanf ("% s", adresa);

U ovom slučaju, adresa imena je već pokazivač i ne treba prefiks &.

Stavke ulaznih podataka moraju biti odvojene razmacima, tabulatorima ili novim redovima.
Znakovi interpunkcije kao što su zarez, tačka i zarez, itd. ne smatraju se graničnicima. To znači da za operatera

Scanf ("% d% d", & r, & c);

Slijed 10 20 će biti prihvaćen, ali sekvenca 10.20 neće. Specifikatori formata scanf () su u istom redoslijedu kao i varijable u listi argumenata kojima su dodijeljene vrijednosti primljenih varijabli.

* iza% i prije specifikacija formata čita podatke navedenog tipa, ali potiskuje dodjelu. Dakle, kod

Scanf ("% d% * c% d", & x, & y);

Kada unesete sekvencu, 10/20 dodjeljuje 10 x, odbacuje / i dodjeljuje 20 y.

Naredbe za formatiranje mogu postaviti modifikator maksimalna širina polja. To je cijeli broj koji se nalazi između znaka % i specifikacije formata. Ograničava broj pročitanih znakova za bilo koje polje. Na primjer, ako trebate pročitati ne više od 20 znakova u adresni niz, napisali biste

Scanf ("% 20s", adresa);

Ako ulazni tok sadrži više od 20 znakova, tada će u sljedećem pozivu funkcija unosa započeti unos od tačke na kojoj je unos zaustavljen tokom trenutnog poziva. Unos polja se može prekinuti prije dostizanja maksimalna dužina polja ako se naiđe na razmak. U ovom slučaju scanf () prelazi na sljedeće polje.

Iako se razmaci, tabulatori i novi redovi koriste kao separatori polja, oni se čitaju kao i svaki drugi znak kada se unese jedan znak. Na primjer, dat je ulazni tok x y, funkcija

Scanf ("% c% c% c", & a, & b, & c);

Staviće znak x u promenljivu a, razmak - u promenljivu b i y - u promenljivu c.

Budite oprezni: svi drugi znakovi u kontrolnoj liniji — uključujući razmake, tabulatore i nove redove — koriste se za specificiranje i uklanjanje znakova iz ulaznog toka. Na primjer, za ulazni tok od 10t20, funkcija

Scanf ("% st% s", & x, & y);

Mjesta 10 u x i 20 u y. t će biti odbačen jer postoji t u kontrolnoj liniji.

Još jedna karakteristika funkcije scanf () naziva se višestruko skeniranje. Skup za skeniranje definira znakove koje će čitati funkcija scanf () i dodijeliti elementima odgovarajućeg niza znakova. Da biste odredili skup skeniranja, morate staviti znakove koji su važeći u uglaste zagrade. Prije prvog uglata zagrada stavlja se znak procenta. Na primjer, sljedeća lista skupova skeniranja navodi da scanf () čita samo znakove A, B i C:

Argument koji odgovara listi skupa skeniranja mora biti pokazivač na niz znakova. Kada koristite višestruko skeniranje, funkcija scanf () čita znakove i postavlja ih u navedeni niz sve dok se ne naiđe na znak koji nije uključen u skup skeniranja (to jest, čitaju se samo znakovi uključeni u skup za skeniranje).

Niz koji vraća scanf () će sadržavati niz završen nultom. Lista čitljivih simbola također se može postaviti u inverznom obliku. Da biste to učinili, postavite ^ kao prvi znak. Tada će scanf () prihvatiti bilo koji karakter koji nije uključen u set za skeniranje.

Koristeći navodnike, možete odrediti raspon znakova koji će se tumačiti. Na primjer, sljedeći izraz upućuje scanf () da prihvati slova od A do Z:

Višestruka skeniranja razlikuju velika slova i mala slova... Ako želite da scanf () prihvati oba, morate ih navesti zasebno u skupu skeniranja.

Funkcija scanf () vraća broj jednak broju polja čije su vrijednosti zapravo dodijeljene varijablama. Ovaj broj ne uključuje polja koja su pročitana, ali njihove vrijednosti nisu dodijeljene ničemu zbog upotrebe modifikatora * za potiskivanje dodjele. Ako dođe do greške prije dodjeljivanja vrijednosti prvom polju, vraća se EOF.

Kada koristite Borland C++ u 16-bitnom okruženju, možete promijeniti zadani memorijski model za kompajliranje vašeg programa tako što ćete eksplicitna indikacija veličina svakog pokazivača koji se koristi u scanf() pozivu. Bliski pokazivač je specificiran modifikatorom N, a pokazivač udaljenim F modifikatorom (Ne možete koristiti N modifikator ako je program kompajliran za model ogromne memorije.)

Funkcija scanf () je višenamenska funkcija koja vam omogućava da unesete bilo koju vrstu podataka u računar. Naziv funkcije odražava njenu svrhu - funkcija skenira (skenira) tastaturu, određuje koji se tasteri pritisnu, a zatim interpretira unos na osnovu SCAN formatiranih znakova. Baš kao i funkcija printf (), scanf () može uzeti više argumenata, dopuštajući na taj način da se vrijednosti numeričkih, znakovnih i string varijabli unose u isto vrijeme.

Baš kao i lista parametara printf (), lista parametara funkcije scanf () se sastoji od dva dijela: niza formata i liste podataka (slika 5.7). Niz formata sadrži indikatore formata, ovdje se oni nazivaju pretvarači znakova* koji definišu kako treba tumačiti unos. Lista podataka sadrži varijable u koje se moraju unijeti ulazne vrijednosti.

Rice. 5.7. Lista parametara funkcije scanf () podijeljena je na dva dijela.

Pokazivači formata su slični onima koje koristi funkcija printf ():

Prilikom unosa numeričkih ili znakovnih podataka, trebali biste navesti adresu varijable u listi podataka funkcije scanf (), a ne samo njeno ime:

scanf ("% f", & iznos);

* Voriginalznakova za konverziju.(Napomena prev.)

U ovom primjeru, funkcija scanf () uzima broj s pomičnim zarezom i umeće ga u memorijsko područje rezervirano za varijablu iznosa. Čim se broj uklopi u ovo područje memorije, on automatski postaje vrijednost varijable.

Dok je funkcija scanf () pokrenuta, program je suspendovan i program čeka na unos podataka. Unos se završava pritiskom na taster Enter.

Način na koji funkcija scanf () radi s podacima bitno se razlikuje od funkcija gets () i getchar (). Da biste razumjeli šta se tačno dešava kada kucate sa scanf (), morate detaljnije pogledati ove razlike.

Ulazni tok

Kada se podaci unose pomoću funkcije gets (), svi znakovi koji su ukucani na tastaturi prije pritiska Enter, postaje vrijednost varijable. Kada se znak unese pomoću funkcije getchar (), pritiskom na tipku automatski se promjenjivi dodijeli odgovarajući znak.

Funkcija scanf () radi drugačije. Umjesto jednostavnog preuzimanja podataka i dodjeljivanja varijabli, scanf () prvenstveno koristi pokazivače formata da bi odredio kako interpretirati unesene znakove.

Uobičajeno je reći da scanf () prima podatke od ulazni tok... Ulazni tok je niz znakova koji dolaze iz nekog izvora. U slučaju scanf (), izvor je tastatura. Nakon pritiska na tipku Enter svi podaci koji su uneseni do tog trenutka prosljeđuju se funkciji scanf () kao još uvijek besmislen skup znakova, istim redoslijedom kojim su upisani. Scanf () zatim određuje koji znakovi odgovaraju tipu specificiranom u specifikaciji formata, a koje treba zanemariti. Pokazivači formata se nazivaju pretvarači znakova jer uzimaju originalne znakove iz ulaznog toka i pretvaraju ih u podatke određenog tipa. Slika 5.8 ilustruje ovaj proces.

Funkcija scanf () zanemaruje prazne znakove kao što su razmaci, tabulatori, novi redovi, osim ako je trenutni tip podataka char. Razmotrite program:

puts ("Molimo unesite broj:");

scanf ("% d", & count);

printf ("Broj je% d", count);

Rice. 5.8. Funkcija scanf () čita ulazni tok i određuje koje podatke treba unijeti, a koje zanemariti

Prije unosa broja, možete pritisnuti tipku za razmak koliko god želite - C će zanemariti razmake, čekajući prvi značajni znak. Tada će C pokušati pretvoriti znakove u skladu sa specifikacijama formata u nizu formata funkcije scanf (). Ako ti znakovi odgovaraju formatu (u ovom slučaju, ako su brojevi), bit će uneseni u varijablu. Unos podataka će se zaustaviti ako se naiđe na znak koji nije u očekivanom formatu, odnosno nije cifra. Na primjer, ako na tastaturi upišete sekvencu "123abc", tada će broj 123 u našem primjeru biti dodijeljen varijabli count, a slova "abc" će biti zanemarena, kao što je prikazano na slici 5.9. Prazno mjesto može uzrokovati zaustavljanje unosa podataka. Na primjer, ako upišete "123", varijabli će biti dodijeljena vrijednost 12, a broj 3 će biti zanemaren.

Rice. 5.9. Funkcija scanf () zaustavlja unos podataka kada naiđe na prvi nenumerički znak

Prvi značajni znak mora odgovarati formatu navedenom u argumentu funkcije scanf (). Dakle, ako odštampate sekvencu "ABC123", program će je zanemariti u cijelosti, a vi ćete ostati u mraku oko vrijednosti varijable.

Koje znakove program smatra "prikladnim" ovisi o specifikacijama formata. Ako je pokazivač % d, tada su "prikladni" samo brojevi i znak minus. Ako stavite pokazivač% x, tada će znakovi 0123456789ABCDE odgovarati formatu, jer se svi koriste prilikom pisanja brojeva u heksadecimalnom zapisu. Ako je pokazivač% c, prihvataju se svi znakovi, čak ni razmak unutar ulaznog toka ne zanemaruje funkcija scanf (). Ako napišete uputstvo:

scanf ("% c", & slovo);

i pritisnite razmaknicu na početku niza značajni simboli, scanf () će postaviti varijablu na razmak, zanemarujući sljedeće znakove. Stoga, kada radite sa char, ne možete stavljati razmake ispred drugih znakova.

Prilikom unosa stringa, scanf () će početi dodjeljivati ​​vrijednost prvom značajnom znaku, zanemarujući vodeće razmake, i prestati dodjeljivati ​​na prvom značajnom znaku. Pogledajte program:

puts ("Molimo unesite svoje ime:");

scanf ("% s", ime);

Imajte na umu da se operator getter ne koristi sa imenom varijable string. Ako na tastaturi upišete "Nancy" i pritisnete Enter, ovi znakovi će biti dodijeljeni imenu varijable. Čak i ako upišete "Nancy Chesin", scanf () će početi dodjeljivati ​​znakove na prvom značajnom znaku i zaustaviti se na prvom razmaku, tako da će varijabla i dalje biti samo Nancyno ime, a program će zanemariti ostatak (slika 5.10).

Rice. 5.10. Funkcija scanf () zaustavlja čitanje znakova u nizu na prvom razmaku

Zbog ove posebnosti funkcije scanf () nije baš zgodna za unos nizova. U ovim slučajevima, bolje je koristiti funkciju gets ().

Top srodni članci