Kako podesiti pametne telefone i računare. Informativni portal

C scanf podebljano. Scanf C funkcija: opis

Tagovi: Formatirani ulaz, formatirani izlaz, printf, scanf, fgets, getch, format string, specificator formata, zastavice, kontrolni znakovi.

Formatirani izlaz

Danas ćemo pogledati dva važne funkcije formatirani ulaz i izlaz. Struktura i rad ovih funkcija mogu se u potpunosti razumjeti tek nakon proučavanja rada sa pokazivačima i funkcijama sa varijabilni broj parametri. Ali ove funkcije morate koristiti sada, tako da ćete morati preskočiti neke točke.

Formatirana izlazna funkcija printf uzima niz formata i argumente koji će biti ispisani prema formatu kao argumente i vraća broj ispisanih znakova. Vraća se u slučaju greške negativno značenje i postavlja vrijednost na ferror. Ako je došlo do više grešaka, errno je jednako EILSEQ.
int printf (const char * format, ...);

#include #include void main () (// funkcija ne prima nikakve argumente, osim reda printf ("Hello world"); getch ();)

Funkcija petlja kroz string i zamjenjuje prvo pojavljivanje % s prvim argumentom, drugo pojavljivanje % s drugim argumentom, itd. Zatim ćemo samo pogledati listu zastavica i primjere korištenja.

Opća sintaksa specificatora formata
% [zastavice] [širina] [.preciznost] [dužina] specifikacija
Specifikator je najviše važna komponenta... Definira tip varijable i kako se prikazuje.

Tab. 1 Specifikator tipa.
Specifikator Ono što želimo da povučemo Primjer
d ili i Potpisani cijeli broj u in decimalni 392
u Neoznačeni cijeli decimalni broj 7235
o Neoznačeni oktal 657
x Heksadecimalni cijeli broj bez predznaka 7fa
X Cijeli broj bez predznaka, heksadecimalni, velika slova 7FA
f ili F Broj s pomičnim zarezom 3.4563745
e Eksponencijalni oblik za broj s pomičnim zarezom 3.1234e + 3
E Eksponencijalni oblik za broj s pomičnim zarezom, velika slova 3.1234E + 3
g Najkraći prikaz formata f i e 3.12
G Najkraće od prikaza F i E formata 3.12
a Heksadecimalni prikaz s pomičnim zarezom -0xc.90fep-2
A Heksadecimalno s pomičnim zarezom, velika slova -0xc.90FEP-2
c Pismo a
s String (niz slova sa nulom) Zdravo svijete
str Adresa pokazivača b8000000
n Ništa ne krpi. Argument mora biti pokazivač na potpisanu int. Ova adresa će pohraniti broj slova koja su bila prikazana prije sastanka% n
% Dva uzastopna procenta prikazuju znak procenta %

#include #include void main () (int a = 0x77, b = -20; char c = "F"; float f = 12,2341524; double d = 2e8; char * string = "Zdravo, svijet!"; printf ("% s \ n ", string); printf (" a =% d, b =% d \ n ", a, b); printf (" a =% u, b =% u \ n ", a, b); printf (" a =% x, b =% X \ n ", a, b); printf (" dec a =% d, oct a =% o, hex a =% x \ n ", a, a, a); printf ("pokretna točka f =% f, exp f =% e \ n", f, f); printf ("dvostruki d =% f ili% E \ n", d, d); printf ("ne podržavaju svi prevodioci % a \ n ", f); printf (" karakter c =% c, kao broj c =% d ", c, c); printf (" adresa stringa je% p ", string); getch ();)

Niz formata također može uključivati ​​sljedeće opcione podspecifikatore: zastavicu, širinu, .precision i modifikator (tim redoslijedom).

Tab. 4 Preciznost.
.Preciznost Opis
.broj Za specifikacije cijelih brojeva (d, i, o, u, x, X), preciznost određuje minimalni broj znakova koji se moraju ispisati. Ako je vrijednost kraća, ispred broja se prikazuju nule. Vrijednost se ne skraćuje, čak i ako je duža. Preciznost od 0 znači da se ništa ne ispisuje za vrijednost 0.
Za specifikacije s pomičnim zarezom (a, A, e, E, f, F), ovo je broj znakova za štampanje nakon decimalnog zareza (podrazumevano 6).
Za g i G, ovo je broj značajnih cifara koje treba odštampati.
Za s se prikazuje navedeni broj znakova. Po defaultu se izlaze svi znakovi do prve nule.
Ako nema broja, tada je zadana preciznost 0
.* Preciznost nije navedena u nizu formata, prosljeđuje se zasebno kao argument, koji mora prethoditi izlaznom broju

#include #include void main () (int a = 0x77, b = -20; char c = "F"; float f = 12,2341524; double d = 2e2; char * string = "Zdravo, svijet!"; printf ("%. 3f \ n ", f); printf ("%. * f \ n ", 2, f); printf ("% 010.3f \ n ", d); printf ("% * d \ n ", 6, a); printf ("% + d \ n", b); printf ("% 0.6d \ n", a); printf ("%. f \ n", d); printf ("%. 4s", string); dobiti (;)

Podspecifikator dužine mijenja dužinu tipa. Ako se dužina ne poklapa sa tipom, vrši se konverzija u traženi tip, ako je moguće.

Tab. 5 Dužina.
specifikacije
Dužina d, i u o x X f F e E g G a A c s str n
(nijedna) int unsigned int duplo int char * praznina * int *
hh signed char unsigned char potpisani znak *
h kratki int unsigned short int kratki int *
l long int unsigned long int wint_t wchar_t * duga int *
ll long long int unsigned long long int long long int *
j intmax_t uintmax_t intmax_t *
z size_t size_t size_t *
t ptrdiff_t ptrdiff_t ptrdiff_t *
L dugačak dupli

#include #include void main () (dugo dugo x = 12300000000579099123; kratko i = 10; printf ("% llu \ n", x); printf ("% d \ n", i); printf ("% hd \ n", i ); gettch ();)

Formatirani unos

Razmislite o formatiranom unosu sa scanf-om.
int scanf (const char *, ...)
Funkcija prihvata niz ulaznog formata (sličan je nizu formata printf) i adrese na koje treba upisati pročitane podatke. Vraća broj uspješno inicijaliziranih argumenata.
Format specifikacije unosa
% [*] [širina] [dužina] specifikacija

Tab. 6 Specifikator tipa.
Specifikator Opis Odabrani likovi
i, u Cijeli proizvoljan broj cifre (0-9), moguće koje počinju sa + ili -. Ako broj počinje sa 0, onda se čita u oktalnom formatu, ako od 0x, onda u heksadecimalnom formatu.
d Decimalni cijeli broj Proizvoljan broj cifara (0-9), eventualno počevši sa + ili -.
o oktalni cijeli broj Proizvoljan broj cifara (0-7), eventualno počevši sa + ili -.
x Heksadecimalni cijeli broj Proizvoljan broj cifara (0-F), eventualno počevši sa + ili - i sa prefiksom 0x ili 0X.
f, e, g Broj s pomičnim zarezom Broj koji se sastoji od skupa cifara 0-9, moguće sa decimalnim separatorom (tačkom). Moguća je i eksponencijalna notacija. C99 vam takođe omogućava da unesete broj u heksadecimalnom formatu.
a
c Simbol Ako širina nije proslijeđena, čita se jedan znak. Ako je širina proslijeđena, onda čita potreban broj znakova i stavlja ih u niz BEZ terminalnog znaka na kraju.
s Linija Čita sve znakove bez razmaka. Ako je specificirana širina, onda ne više od n znakova. Zamjenjuje n + 1 terminalnih znakova.
str Adresa pokazivača Niz znakova koji se tumači kao adresa pokazivača. Format zavisi od implementacije, ali je isti kao kako printf izlazi sa ključem p
[likovi] Mnogo likova Čita samo one znakove koji su napisani u uglastim zagradama, C99
[^ znakova] Mnogo likova Čita samo one znakove koji nisu navedeni u uglastim zagradama, C99
n Ne čita ništa Pohranjuje broj znakova koji su već pročitani na navedenu adresu

Kao i kod printf-a, širina specificirana znakom * očekuje argument koji će dati širinu. Dužina zastave je ista kao i takva zastava printf funkcije.

#include #include void main () (int godina, mjesec, dan; char bafer; int count; // Zahtijeva formatirani unos, na primjer 2013: 12: 12 printf ("Unesite podatke poput x: x: x ="); scanf ("% d :% d:% d ", & godina, & mjesec, & dan); printf (" godina =% d \ nmonth =% d, dan =% d \ n ", godina, mjesec, dan); // Čitaj string, ne više od 127 karaktera Prilikom čitanja u niz, ne morate pisati & // jer je niz zamijenjen pokazivačem printf ("Unesite string ="); scanf ("% 127s", bafer); printf ("% s", bafer); getch ( );)

Pored funkcija scanf i printf, postoji niz funkcija koje vam omogućavaju primanje ulaznih podataka.

int gettch ()- vraća uneseni znak, ali ga ne ispisuje na konzolu. #include #include void main () (char c = 0; do (c = getch (); printf ("% c", c);) while (c! = "q");)

char * fgets (char * str, int num, FILE * stream)- funkcija vam omogućava čitanje niza sa razmacima. Unatoč činjenici da radi s datotekom, možete je koristiti za čitanje standardni stream unos. Njegova prednost u odnosu na gets je u tome što vam omogućava da specificirate maksimalna veličina red koji se čita i završava red sa terminalnim znakom.

#include #include #include void main () (char buffer; // Čitanje iz standardnog ulaznog toka fgets (bafer, 127, stdin); printf ("% s", bafer); // Ovo može zamijeniti čekanje na unos znakova scanf ("1" );)

Nije full set različite funkcije unos i izlaz karaktera. Postoji mnogo takvih funkcija, ali mnoge od njih nisu bezbedne, pa pažljivo pročitajte dokumentaciju pre upotrebe.

] SCANF #include int scanf (format-string [[, argument ...]]); char * format-string. format kontrolnog niza. Opis. Scanf čita podatke sa stdin-a na lokaciju navedenu 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 "", tab \ t, novi red "\ n". Za scanf, razmak se koristi za čitanje, ali ne pamti, svih narednih unesenih znakova razmaka, do prvog znaka koji nije razmak. 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 iz 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 Razmak, tabulator ili karakter novog reda, 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 kontrolnom nizu formata; 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 oktalnog broja
  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.

Funkcija scanf () je procedura opće namjene koji čita stdin tok i pohranjuje informacije u varijablama specificiranim argumentima navedenim u listi argumenata. Može čitati sve ugrađene tipove podataka i automatski ih pretvarati u odgovarajući interni format.

C99 primjenjuje kvalifikator ograničenja na parametar formata.

Kontrolni niz specificiran parametrom formata sastoji se od tri kategorije znakova:

  • specifikacije formata;
  • razmaci;
  • znakovi osim razmaka.

Specifikatori formata - kojima prethodi znak procenta (%) - govore vam koji tip podataka će se sljedeće čitati. Na primjer, specifikacija % s će pročitati string, a % d će pročitati cjelobrojnu vrijednost. Niz formata se čita s lijeva na desno, a specifikacije formata se poklapaju s argumentima navedenim u listi argumenata. Ovi kodovi su prikazani u sljedećoj tabeli.

Šifra Imenovanje
%a Čita vrijednost s pomičnim zarezom (samo C99)
%A Isto kao% kod (samo C99)
%Sa Čita jedan znak
% d Čita decimalni cijeli broj
% i Čita cijeli broj u bilo kojem formatu (decimalni, oktalni, heksadecimalni)
% e Čita pravi broj
% E Slično kodu% e
% f Čita pravi broj
% F Isto kao kod% f (samo C99)
% g Čita pravi broj
% G Isto kao kod% g
%O Čita oktalni broj
% s Čita red
%X Čita heksadecimalni broj
% X Slično kodu% x
%R Čita pokazivač
% n Prihvata cjelobrojnu vrijednost jednaku broju do sada pročitanih znakova
% u Čita decimalni cijeli broj bez predznaka
% Traži skup znakova
%% Čita znak postotka

Podrazumevano, specifikacije a, f, e i g prisiljavaju scanf () da dodijeli podatke varijablama. float... Ako jednom od ovih specifikacija formata dodate modifikator l, scanf () će dodijeliti ono što je pročitao varijabli tipa duplo... Upotreba modifikatora L znači da je varijabla koja uzima vrijednost tipa long double.

Ako koristite moderan kompajler koji podržava mogućnost dvobajtnog karaktera dodanog 1995. godine, možete koristiti modifikator l u specifikaciji c da označite pokazivač na dvobajtni znak sa tipom podataka whcar_t. Modifikator l se također može koristiti sa kodom formata s za označavanje pokazivača na dvobajtni niz znakova. Dodatno, l modifikator se može koristiti za izmjenu dvobajtnog skupa znakova koji se skenira.

Razmaci u nizu formata uzrokuju da scanf () preskoči jedan ili više razmaka u ulaznom toku. Razmak se odnosi na razmak, tabulator ili znak novog reda. U suštini, jedan znak razmaka u kontrolnom nizu će uzrokovati da scanf () pročita, ali ne i pohrani, bilo koji broj (čak i nula) razmaka do prvog razmaka koji nije razmak.

Znak koji nije razmak u nizu formata uzrokuje da scanf () pročita i odbaci odgovarajući znak. Na primjer, kada koristite niz formata % d,% d, scanf () će prvo pročitati cjelobrojnu vrijednost, zatim pročitati i odbaciti zarez i na kraju pročitati drugi cijeli broj. Ako navedeni znak nije pronađen, funkcija scanf () će izaći.

Sve varijable koje se koriste za primanje vrijednosti s funkcijom scanf () moraju se proslijediti koristeći njihove adrese. To znači da svi argumenti moraju biti pokazivači na varijable.

Elementi ulaznog toka moraju biti odvojeni razmacima, tabulatorima ili novim redovima. Znakovi kao što su zarez, tačka i zarez, itd. nisu prepoznati kao separatori. To znači da operater

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

prihvatit će vrijednosti unesene kao 10 20, ali će potpuno odbaciti "posudu" posluženu kao 10.20.

* iza znaka % i prije koda formata će pročitati podatke dati tip ali će zabraniti njihov zadatak. Dakle, operater

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

prilikom unosa podataka u formu 10/20, vrijednost 10 će staviti u varijablu x, odbaciti znak dijeljenja i dodijeliti vrijednost 20 varijabli y.

Naredbe za formatiranje mogu sadržavati modifikator maksimalna dužina polja. To je cijeli broj između znaka % i koda formata koji ograničava broj znakova koji se mogu pročitati za bilo koje polje. Na primjer, ako ne želite pročitati više od 20 znakova u adresnu varijablu, koristite sljedeću naredbu.

Scanf ("% 20s", adresa);

Ako ulazni tok sadrži više od 20 znakova, tada će sljedeći poziv na operaciju unosa početi čitati od točke gdje je prethodni poziv funkcije scanf () "zaustavljen". Nakon detekcije razmak unos podataka za polje može se završiti prije nego se dostigne maksimalna dužina polja. U ovom slučaju, funkcija scanf () prelazi na čitanje sljedećeg polja.

Iako se razmaci, tabulatori i novi redovi koriste kao separatori polja, oni se čitaju kao i svaki drugi znak kada se pročita jedan znak. Na primjer, ako se ulazni tok sastoji od znakova x y, onda operator

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

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

Imajte na umu da bilo koji drugi karakter kontrolna linija Specifikatori neformata (uključujući razmake, tabulatore i nove redove) se koriste za podudaranje i odbacivanje znakova iz ulaznog toka. Na primjer, ako ulazni tok izgleda kao 10t20, operator

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

staviće 10 u x i 20 u y. Znak t se odbacuje jer se pojavljuje u kontrolnoj liniji.

Drugi način korištenja funkcije scanf () naziva se scanset. U ovom slučaju se određuje skup znakova koji se može pročitati pomoću funkcije scanf () i dodijeliti odgovarajućem nizu znakova. Da biste definirali takav skup, morate staviti znakove koji se skeniraju u uglaste zagrade. Otvaranje uglata zagrada mora odmah pratiti znak procenta. Na primjer, sljedeći skup skeniranih znakova ukazuje na to da samo znakove A, B i C treba pročitati.

% [ABC]

Kada se koristi skup znakova koji se skenira, scanf () nastavlja čitati znakove i stavlja ih u odgovarajući niz znakova sve dok ne naiđe na znak koji nije u navedenom skupu. Odgovarajuća varijabla mora biti pokazivač na niz znakova. Kada se vrati iz scanf (), ovaj niz će sadržavati niz pročitanih znakova završen nulom.

Ako je prvi znak u skupu znak za umetanje (^), onda dobijamo suprotan efekat: polje za unos se čita do prvog znaka iz datog skupa znakova, tj. znak za umetanje uzrokuje da scanf () prihvati sve znakove koji nisu definirani u skupu.

Mnogi prevodioci vam dozvoljavaju da navedete opseg sa crticom. Na primjer, sljedeća izjava uzrokuje da scanf () prihvati znakove od A do Z.

Važno je zapamtiti da skenirani skup znakova razlikuje velika slova i mala slova... Stoga, ako želite skenirati i velika i mala slova, postavite ih zasebno.

Funkcija scanf () vraća broj jednak broju polja kojima su uspješno dodijeljene vrijednosti. Ova polja ne uključuju polja koja su pročitana, ali dodjela nije izvršena zbog upotrebe modifikatora * za suzbijanje dodjele. Ako dođe do greške prije dodjeljivanja prvog polja, scanf () vraća EOF.

C99 je dodao modifikatore formata u scanf ().

C99 verzija dodaje nekoliko modifikatora formata za upotrebu u funkciji scanf (): hh, ll, j, z i t. Modifikator hh može se primijeniti na specifikacije d, i, o, i, x i n. To znači da je odgovarajući argument pokazivač na vrijednost znakova s ​​predznakom ili nepotpisane znakove. Modifikator ll se također može primijeniti na specifikacije d, i, o, i, x, i n. To znači da je odgovarajući argument pokazivač na vrijednost signed long long int ili unsigned long long int.

Modifikator formata j, koji se primjenjuje na specifikacije d, i, o, u, x i n, znači da je odgovarajući argument pokazivač na vrijednost tipa intmax_t ili uintmax_t. Ovi tipovi su deklarisani u zaglavlju i služe za pohranjivanje cijelih brojeva što je duže moguće.

Modifikator z formata, koji se primjenjuje na specifikacije d, i, o, u, x i n, znači da je odgovarajući argument pokazivač na objekt tipa size_t. Ovaj tip je deklarisan u zaglavlju i koristi se za pohranjivanje rezultata veličine operacije.

Modifikator formata t, koji se primjenjuje na specifikacije d, i, o, u, x i n, znači da je odgovarajući argument pokazivač na objekt tipa ptrdiff_t. Ovaj tip je deklarisan u zaglavlju i služi za pohranjivanje vrijednosti razlike između dva pokazivača.

Funkcija printf () omogućava ispis informacija na ekran prilikom programiranja u načinu rada konzole. Ova funkcija je definiran u biblioteci stdio.h i ima sljedeću sintaksu:

int printf (const char * format [, argument] ...);

Ovdje prvi argument, * format, specificira niz koji se ispisuje na ekran i može sadržavati posebne kontrolne znakove za prikaz varijabli. Nakon toga slijedi lista neobaveznih argumenata, koji su objašnjeni u nastavku. Funkcija vraća ili broj prikazanih znakova ili negativan broj ako ne radi ispravno.

U svojoj najjednostavnijoj implementaciji, printf () funkcija jednostavno ispisuje dati niz na ekran monitora:

printf (“Zdravo svijete.”);

Međutim, može se koristiti za prikaz varijabli različite vrste: počinje brojevima i završava se nizovima. Za izvođenje ove operacije koriste se posebni kontrolni znakovi, koji se nazivaju specifikacijama i koji počinju sa znakom %. Sljedeći primjer pokazuje izlaz cjelobrojne varijable num na ekran monitora pomoću funkcije printf ():

int num;
broj = 5;
printf (“% d”, broj);

Prva dva reda ovog programa definiraju varijablu pod nazivom num tipa int. Treći red ispisuje varijablu na ekran. Funkcija printf () izgleda ovako. Funkcija prvo analizira string koji će biti prikazan. V u ovom slučaju ovo je "% d". Ako ovaj red sadrži specifikaciju, tada se na njeno mjesto upisuje vrijednost varijable, koja je drugi argument funkcije printf (). Kao rezultat, umjesto originalna linija Na ekranu će se pojaviti "% D" linija "5", tj. biće prikazan broj 5.

Treba napomenuti da specifikacija "% d" daje samo cjelobrojne tipove varijabli, na primjer int. Druge specifikacije treba koristiti za izvođenje drugih tipova. Glavni tipovi specifikacija su navedeni u nastavku:

% s - jedan znak
% d - decimalni cijeli broj sa predznakom
% f - broj s pomičnim zarezom (decimalni zapis)
% s - niz znakova (za string varijable)
% u - decimalni cijeli broj bez predznaka
%% - ispisati znak postotka

Pomoću funkcije printf () možete ispisati nekoliko varijabli odjednom. Za to se koristi sljedeća konstrukcija:

int num_i;
float num_f;
broj_i = 5;
broj_f = 10,5;
printf (“num_i =% d, num_f =% f”, num_i, num_f);

Rezultat izvršavanja programa će izgledati ovako:

num_i = 5, num_f = 10,5

Osim specifikacija, funkcija printf () koristi kontrolne znakove, kao što su redak \ n, tabs \ t, itd. Na primjer, ako je u prethodno razmatranom primjeru potrebno prikazati vrijednosti varijabli koje nisu u liniju, ali u koloni, tada funkcija printf () mora biti prepisana na sljedeći način:

printf (“num_i =% d, \ n num_f =% f”, num_i, num_f);

Znak tab se koristi na sličan način.

Za unos informacija s tastature zgodno je koristiti funkciju scanf () biblioteke stdio.h, koja ima sljedeću sintaksu:

int scanf (const char * format [, argument] ...);

Ovdje, što se tiče funkcije printf (), definira se varijabla formata * format string za određivanje tipa ulaznih podataka i može sadržavati iste specifikacije kao funkcija printf (). Zatim, postoji lista neobaveznih argumenata. Listing 1.4 pokazuje kako scanf () radi.

Listing 1.4. Primjer korištenja funkcije scanf ().

#include
int main ()
{
int age;
težina plovka;
printf (“Unesite podatke o vašim godinama:”);
scanf (“% d”, & starost);
printf (“Unesite informacije o svojoj težini:”);
scanf (“% f”, & težina);
printf (“Vaše godine =% d, vaša težina =% f”, starost, težina);

Povratak 0;
}

Glavna razlika između upotrebe funkcije scanf () i funkcije printf () je znak & ispred imena varijable u koju se upisuju rezultati unosa.

Funkcija scanf () može raditi s nekoliko varijabli odjednom. Pretpostavimo da trebate unijeti dva cijela broja sa tastature. Formalno, za ovo možete dvaput pozvati funkciju scanf (), ali je bolje koristiti ovu konstrukciju:

scanf (“% d,% d”, & n, & m);

Funkcija scanf () ovo tumači kao da očekuje da korisnik unese broj, zatim zarez, a zatim drugi broj. Sve se dešava kao da treba da unesete dva cela broja na sledeći način:

Funkcija scanf () vraća broj uspješno pročitanih stavki. Ako se operacija čitanja nije dogodila, što se dešava kada, umjesto očekivanog digitalna vrijednost unese se bilo koje slovo, tada je povratna vrijednost 0.

Top srodni članci