Kako postaviti pametne telefone i računala. Informativni portal
  • Dom
  • Programi
  • Čitanje datoteke pomoću scanf-a u c. Istraživanje i korištenje funkcija Printf () i Scanf ().

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

] SCANF #include int scanf (format-string [[, argument ...]]); char * format-string. kontrolni niz formata. Opis. Funkcija Scanf čita podatke iz standardni tok stdin na mjesto navedeno argumentima. Svaki argument mora biti pokazivač na vrijednost s vrstom koja odgovara tipu navedenom u nizu formata. Niz formata kontrolira transformacije polja za unos. Ovaj niz može sadržavati sljedeće: "Whitespace" znakove, t.j. razmak "", tabulatori \ t, nova linija"\ n". Za scanf funkcije razmak definira čitanje, ali bez pamćenja, svih unesenih sljedećih znakova razmaka do prvog znaka bez razmaka. Dok upisujete, jedan razmak u nizu formata odgovara bilo kojem broju, uključujući 0, ili bilo kojoj kombinaciji znakova razmaka. Bilo koji kontrolni znak osim znaka razmaka i znaka postotka%. Zatim se ovaj simbol za scanf funkciju određuje čitanjem, ali bez pohranjivanja odgovarajućih kontrolnih simbola. Ako je sljedeći lik u ne odgovara kontrolnim znakovima, tada scanf izlazi. Specifikacija formata unesena sa znakom %. U tom slučaju scanf čita i pretvara unesene znakove u unesene vrijednosti. ovog tipa a vrijednosti su određene odgovarajućim argumentima s popisa argumenata. Niz formata se čita s lijeva na desno. Pretpostavlja se da su znakovi izvan specifikacije formata u skladu sa slijedom znakova u stdin toku; ovi podudarni znakovi u stdin-u se skeniraju, ali se ne pamte. Ako je znak u stdin u sukobu sa nizom formata, scanf izlazi. Ovaj sukobljeni znak ostaje u stdin jer se ne može č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 mjestu navedenom prvim argumentom. Prema drugoj specifikaciji formata, drugo polje unosa se pretvara i pohranjuje drugim argumentom; i tako redom do kraja formatnog niza. Polje za unos ograničeno je prvim znakom "razmaka" ili prvim znakom koji se ne može pretvoriti u navedeni format ili velikim brojem postignuća polja širine to je prvo. Ako je za odabranu specifikaciju formata dano više argumenata nego što je potrebno, dodatni se argumenti zanemaruju. Specifikacija formata ima sljedeći oblik. % <.precision><{F:N:h:I}>... Svako polje u BOM formatu je zaseban znak ili broj koji izražava zasebnu opciju formata. Znak tipa koji se pojavljuje nakon posljednjeg izborno polje format, definira vrstu polja za unos kao znak, niz ili broj. Najjednostavniji format BOM sadrži samo znak postotka i simbol tipa (na primjer,% S). Svako polje specifikacije formata opisano je 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 redoviti niz znakova, tj. slijed koji treba unijeti. Na primjer, za unos znaka % upotrijebite %%. Zvjezdica (*) iza znaka % potiskuje označavanje sljedećeg polja za unos, koje je navedeno kao polje određeno po vrsti. Ovo polje se skenira, ali se ne pamti. Widht je pozitivan decimalni cijeli broj i kontrolira maksimalni broj znakova koji se čitaju iz stdin. Samo oni znakovi koji ne prelaze širinu se transformiraju i pamte odgovarajućim argumentom. Ako u širini ima znakova razmaka, t.j. razmak, tabulator ili novi redak, oni se ne pretvaraju u odabrani format dok se ne dosegne širina. Opcijski F i N prefiksi ne poštuju zadanu konvenciju adresiranja korištenih memorijskih modela. F može biti prefiks argumentu koji ukazuje na udaljeni objekt; i N prema bliskom objektu. Izborni prefiks l označava da se koristi duga verzija; a prefiks h označava korištenje kratke verzije. Odgovarajući argument ukazuje na dugi ili dvostruki objekt (koristeći prefiks l) ili kratki objekt (koristeći prefiks h). Modifikatori l i h mogu se koristiti zajedno s 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 tablici R.4. Tablica 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 cjelobrojni pokazivač na int. O oktalni cjelobrojni 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 neoznačeni decimalni pokazivač na neoznačeni cijeli broj. U neoznačeni decimalni pokazivač na dugi 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 znamenki, obično sadrži decimalni zarez i eksponent ("e "," E "), koji se zapisuje iza predznačene vrijednosti cijelog broja. c karakter. Pokazivač znakova na char. Znakovi za razmak, tabulator ili novi red, takozvani "razmak", koji se obično zanemaruju, čitaju se kada je navedena vrsta. % 1s se koristi za čitanje sljedećeg znaka koji nije razmak. s niz. pokazivač na niz znakova dovoljno velik za polje za unos, zajedno s nultim terminatorom "\ 0" koji se pojavljuje automatski. n čitanje na ulazu pokazivača na int, u iz toka ili iz kojeg je međuspremnik upisan, ali se uspješno broji. znakove iz toka ili međuspremnika, 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. znamenke x i y su velike heksadecimalne znamenke. Prilikom čitanja nizova koji nisu razgraničeni znakovima razmaka, skup znakova u uglastim zagradama mora se zamijeniti nizom tipa s. Odgovarajuće polje za unos čita se do prvog znaka koji nije sadržan u skupu znakova omeđenog uglastim zagradama. Ako je prvi znak u ovom skupu karet (^), rezultat se sprema: 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 znaka s definira argument koji ukazuje na niz znakova. Sljedećih n znakova čita se iz ulaznog toka na navedeno mjesto, a nulti znak se ne zapisuje. Funkcija scanf skenira znak po znak za svako polje unosa. Može završiti čitanje jednog polja kada dosegne razmak, ako se dosegne bilo koje polje širine; ili se sljedeći ulazni znak ne može pretvoriti u navedeni format; ili je sljedeći znak u sukobu s 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 sukobljenog znaka. Ovaj znak, ako ga postoji, tretira se kao nepročitani, bilo kao prvi znak sljedećeg polja za unos, ili kao prvi znak u sljedećim č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. Vidi također 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"); do (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 kad se daju svi podaci, a ništa ne treba unositi. Ali, vjerujte mi, to se praktički ne događa. Sjetite se škole, kada ste mjerili određene stvari, a zatim su dobivene vrijednosti umetnute u potrebne formule.

scanf

U jeziku C, osim printf izlazne funkcije, postoji i funkcija scanf za unos. Evo funkcije scanf upravo sada i pogledat ćemo pobliže:

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

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

Unesenu vrijednost moramo napisati ne negdje tamo, već točno na adresi na kojoj se nalazi naša varijabla. Oni. unsigned (&) naša unesena vrijednost ići će na sva mjesta osim na ono što nam je potrebno. Stoga, kad god trebate unijeti vrijednosti s tipkovnice, 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 - pročitati 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. plutati t;
    scanf ("% f", & t);

  9. % s - znak za čitanje
  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 usporedbe

Računalo je izvorno instalirano booleova 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 čuvar zaslona sastoji samo od ova dva magična broja.

Naravno, 0 i 1 su dobri, ali trebamo logički razum, dakle logičke operacije 0 je LAŽ, a 1 je TAČNO. Ovi koncepti TOČNO i LAŽNO su usko povezani operacije usporedbe... Za početak, ovdje su sve vrste operacija usporedbe:

Uglavnom, najčešća pogreška koju čine početnici je da pomiješaju operaciju dodjele (=). operacija usporedbe(==). To su potpuno različite stvari. Ali na početku kodiranja svi imaju greške upravo po ovoj osnovi, stoga budite oprezni.

Funkcije printf () i scanf () daju nam mogućnost interakcije s programom. Nazivamo 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 dane su u biblioteci stdio.h. Obično printf () i scanf () rade na isti način - svaki koristi kontrolni niz i popis argumenata. Prvo ćemo pogledati kako radi printf (), a zatim scanf ().

Format

Vrsta prikazane informacije

decimalni cijeli broj

jedan lik

niz znakova

eksponencijalni zapis

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

Upute dane printf () kada želimo ispisati neku varijablu ovise o tome 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 tablici.

Pogledajmo sada kako se ovi oblici primjenjuju:

/* pečat */

#uključiti

#define PI 3.14159

int broj = 2003;

printf ("Internet sveučilište informacijskih tehnologija otvoreno 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 ispis, koji mogu biti varijable, konstante ili čak izrazi izračunati prije tiska.

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 u 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 ispisani tekstualno.

    Identifikatori podataka, također tzv specifikacije konverzije .

Svaki argument s popisa koji slijedi nakon kontrolnog niza mora imati jedan specifikacija konverzije... Ako trebate ispisati bilo koju frazu, nema potrebe za korištenjem specifikacija konverzije; ako trebate samo ispisati podatke, možete bez komentara. Stoga, svaki od operateri u nastavku su sasvim prihvatljivi:

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

printf ("% c% d \ n", "$", trošak);

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

Na primjer:

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

Rezultat programa će izgledati ovako:

Samo 5% stanovništva može samostalno studirati!

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

Modifikatori

Značenje

Argument će se ispisati s pozicije lijeve margine zadane širine... Tipično, ispis argumenta završava na krajnjoj desnoj poziciji margine. Primjer:% -10

niz brojeva

Određuje minimalnu širinu polja. Koristit će se veće polje ako ispisani broj ili redak ne stane u izvorno polje Primjer:% 4d

niz brojeva

Određuje preciznost: za tipove podataka s pomičnim zarezom, broj znamenki za ispis desno od decimalne točke; za nizove znakova - maksimalan broj znakova za ispis Primjer:

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

Odgovarajuća stavka ima dugi 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 zadani izbor, odnosno rezultat radnje prevoditelja ako mu niste dali nikakve dodatne upute. Drugi specifikacija konverzije-% 2d. Označava da širina polja treba biti 2, ali budući da se broj sastoji od tri znamenke, polje se automatski proširuje na potrebnu veličinu. Sljedeći specifikacija% 10d označava da je širina polja 10. Posljednje specifikacija% -10d također označava širinu polja od 10, a znak - uzrokuje pomak cijelog broja ulijevo.

Funkcija scanf () je rutina unosa Opća namjena koji čita podatke iz stdin toka. Ona može pročitati podatke svih osnovne vrste i automatski ih pretvoriti 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 slijede znak postotka i govore scanf-u () koju vrstu podataka treba čitati sljedeće. Kodovi specifikacija prikazani su u tablici.

Tablica: Kodovi formata za scanf ()
Kod Značenje
%S Brojite jedan znak
% d
% i Smatrati decimalni broj cijeli tip
% e
% f Pročitajte broj s pomičnim zarezom
% g Pročitajte broj s pomičnim zarezom
%O Brojite oktalni broj
% s Pročitaj redak
%X Pročitaj heksadecimalni broj
%R Pokazivač čitanja
% n Prihvaća 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 niz, a % d čita cjelobrojnu varijablu.

Niz formata se čita s lijeva na desno, preslikavajući između kodova formata i argumenata s popisa argumenata.

Posebni znakovi u kontrolnom nizu uzrokuju da scanf () preskoči jedan ili više njih posebni znakovi u ulaznom toku. Posebni znakovi su razmak, tabulator ili novi redak. Jedan poseban znak u kontrolnoj liniji uzrokuje da scanf () čita, bez pamćenja, bilo koji broj (uključujući nulu) susjednih posebnih znakova iz ulaznog toka, sve dok se ne naiđe na neposeban 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ćuje prolazak po referenci, a to omogućuje funkciji promjenu sadržaja argumenta.

Scanf ("% d", & count);

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

Scanf ("% s", adresa);

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

Stavke ulaznih podataka moraju biti odvojene razmacima, tabulatorima ili novim recima.
Interpunkcijski znakovi kao što su zarez, točka-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 na popisu argumenata kojima su dodijeljene vrijednosti primljenih varijabli.

* iza% i prije specifikacije formata čita podatke navedene vrste, ali potiskuje dodjelu. Dakle, kod

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

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

Naredbe za oblikovanje 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 ne trebate pročitati 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 točke na kojoj je unos zaustavljen tijekom trenutnog poziva. Unos polja može se prekinuti prije dolaska maksimalna duljina 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 razdjelnici polja, čitaju se kao i svaki drugi znak kada se unese jedan znak. Na primjer, s obzirom na ulazni tok x y, funkcija

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

Smjestit će znak x u varijablu a, razmak - u varijablu b i y - u varijablu c.

Budite oprezni: svi drugi znakovi u kontrolnom retku — uključujući razmake, tabulatore i nove retke — koriste se za određivanje 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 značajka 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 prve uglata zagrada stavlja se znak postotka. Na primjer, sljedeći popis skupova skeniranja navodi da scanf () čita samo znakove A, B i C:

Argument koji odgovara popisu skupa skeniranja mora biti pokazivač na niz znakova. Kada koristite višestruko skeniranje, funkcija scanf () čita znakove i stavlja 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 () sadržavat će niz s nultim završetkom. Popis čitljivih simbola također se može postaviti u inverznom obliku. Da biste to učinili, stavite ^ kao prvi znak. Tada će scanf () prihvatiti bilo koji znak koji nije uključen u skup 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šestruko skeniranje razlikuje velika slova i mala slova... Ako želite da scanf () prihvati oboje, morate ih zasebno navesti 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 ničemu dodijeljene zbog upotrebe modifikatora * za suzbijanje dodjele. Ako dođe do pogreške prije dodjele 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 da eksplicitna naznaka veličina svakog pokazivača korištenog u scanf() pozivu. Bliski pokazivač specificiran je modifikatorom N, a udaljeni pokazivač F modifikatorom (Ne možete koristiti modifikator N ako je program preveden za model velike memorije.)

Funkcija scanf () je višenamjenska funkcija koja vam omogućuje unos bilo koje vrste podataka u vaše računalo. Naziv funkcije odražava njezinu svrhu - funkcija skenira (skenira) tipkovnicu, određuje koje su tipke pritisnute, a zatim interpretira unos na temelju SCAN formatiranih znakova. Baš kao i funkcija printf (), scanf () može uzeti više argumenata, dopuštajući na taj način istovremeno unos vrijednosti numeričkih, znakovnih i string varijabli.

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

Riža. 5.7. Popis parametara funkcije scanf () podijeljen je u dva dijela.

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

Prilikom unosa numeričkih ili znakovnih podataka, trebali biste navesti adresu varijable u popisu podataka funkcije scanf (), a ne samo njezin naziv:

scanf ("% f", & iznos);

* Vizvornikznakova za pretvorbu.(Napomena prijevod.)

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

Dok je funkcija scanf () pokrenuta, program je obustavljen i program čeka na unos podataka. Unos završava pritiskom na tipku Unesi.

Način na koji funkcija scanf () radi s podacima bitno se razlikuje od funkcija gets () i getchar (). Kako biste razumjeli što se točno događa kada tipkate sa scanf (), morate pobliže pogledati te razlike.

Ulazni tok

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

Funkcija scanf () radi drugačije. Umjesto jednostavnog uzimanja podataka i dodjeljivanja varijabli, scanf () prvenstveno koristi pokazivače formata kako 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 tipkovnica. Nakon pritiska na tipku Unesi 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 navedenom u specifikaciji formata, a koje treba zanemariti. Pokazivači formata nazivaju se pretvaračima znakova jer uzimaju izvorne znakove iz ulaznog toka i pretvaraju ih u podatke određene vrste. Slika 5.8 ilustrira ovaj proces.

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

puts ("Molimo unesite broj:");

scanf ("% d", & count);

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

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

Prije unosa broja možete pritisnuti razmaknicu koliko god želite - C će zanemariti razmake, čekajući prvi značajni znak. Zatim će C pokušati pretvoriti znakove prema 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 znamenka. Na primjer, ako upišete slijed "123abc" na tipkovnici, 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.

Riža. 5.9. Funkcija scanf () prestaje unositi podatke kada naiđe na prvi nenumerički znak

Prvi značajni znak mora odgovarati formatu navedenom u argumentu funkcije scanf (). Dakle, ako ispišete slijed "ABC123", program će ga 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, budući da se svi koriste pri pisanju brojeva u heksadecimalnom zapisu. Ako je pokazivač % c, prihvaćaju se svi znakovi, čak ni razmak unutar ulaznog toka ne zanemaruje funkcija scanf (). Ako napišeš instrukciju:

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 niza, scanf () će početi dodjeljivati ​​vrijednost prvom značajnom znaku, zanemarujući vodeće razmake i prestati dodjeljivati ​​prvom značajnom znaku. Pogledajte program:

puts ("Molimo unesite svoje ime:");

scanf ("% s", ime);

Imajte na umu da se operator getter ne koristi s imenom varijable niza. Ako na tipkovnici 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).

Riža. 5.10. Funkcija scanf () zaustavlja čitanje znakova u nizu na prvom razmaku

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

Vrhunski povezani članci