Kako postaviti pametne telefone i računala. Informativni portal

C scanf podebljano. Scanf C funkcija: opis

Oznake: Formatirani ulaz, formatirani izlaz, printf, scanf, fgets, getch, formatni niz, 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 s pokazivačima i funkcijama s varijabilni broj parametrima. Ali sada morate koristiti ove funkcije, tako da ćete morati preskočiti neke točke.

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

#uključiti #uključiti void main () (// funkcija ne prima nikakve argumente, osim retka printf ("Hello world"); getch ();)

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

Opća sintaksa specificatora formata
% [zastavice] [širina] [. preciznost] [dužina] specificator
Specifikator je najviše važna komponenta... Definira vrstu varijable i način na koji se prikazuje.

Tab. 1 Specifikator vrste.
Specifikator Ono što želimo povući Primjer
d ili i Predpisani cijeli broj u in decimal 392
u Decimala bez predznaka 7235
o Neoznačeni oktal 657
x Heksadecimalni cijeli broj bez predznaka 7fa
x Neoznačeni cijeli broj, 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ći od prikaza formata F i E 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 završenih nulom) Pozdrav 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 postotka prikazuju znak postotka %

#uključiti #uključiti 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 (" znak c =% c, kao broj c =% d ", c, c); printf (" adresa niza je% p ", string); getch (;)

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

Tab. 4 Točnost.
.Točnost Opis
.broj Za specifikacije cjelobrojnih (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 ispis nakon decimalne točke (zadano 6).
Za g i G, ovo je broj značajnih znamenki koje treba ispisati.
Za s se prikazuje navedeni broj znakova. Prema zadanim postavkama, izlaze se 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

#uključiti #uključiti 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); uhvatiti (;)

Podspecifikator duljine mijenja duljinu tipa. Ako se duljina ne podudara s vrstom, vrši se pretvorba u traženu vrstu, ako je moguće.

Tab. 5 Duljina.
specifikacije
Duljina d, i u o x X f F e E g G a A c s str n
(nijedno) int unsigned int dvostruko int char * praznina * int *
hh potpisani char unsigned char potpisani znak *
h kratki međunar nepotpisan kratki int kratki int *
l dugo int unsigned long int wint_t wchar_t * duga int *
ll dugo dugo int unsigned long long int long long int *
j intmax_t uintmax_t intmax_t *
z veličina_t veličina_t veličina_t *
t ptrdiff_t ptrdiff_t ptrdiff_t *
L duga dvostruka

#uključiti #uključiti void main () (dugi dug x = 12300000000579099123; kratki i = 10; printf ("% llu \ n", x); printf ("% d \ n", i); printf ("% hd \ n", i ); dobiti (;)

Formatirani unos

Razmislite o formatiranom unosu sa scanf-om.
int scanf (const char *, ...)
Funkcija prihvaća 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] specificator

Tab. 6 Specifikator vrste.
Specifikator Opis Odabrani likovi
ja, u Cijeli proizvoljan broj znamenke (0-9), moguće koje počinju s + ili -. Ako broj počinje s 0, tada se čita u oktalnom formatu, ako od 0x, onda u heksadecimalnom formatu.
d Decimalni cijeli broj Proizvoljan broj znamenki (0-9), eventualno počevši s + ili -.
o oktalni cijeli broj Proizvoljan broj znamenki (0-7), eventualno počevši s + ili -.
x Heksadecimalni cijeli broj Proizvoljan broj znamenki (0-F), eventualno počevši s + ili - i s prefiksom 0x ili 0X.
f, e, g Broj s pomičnim zarezom Broj koji se sastoji od skupa znamenki 0-9, moguće s decimalnim razdjelnikom (točkom). Moguća je i eksponencijalna notacija. C99 vam također omogućuje unos broja u heksadecimalnom formatu.
a
c Simbol Ako širina nije proslijeđena, čita se jedan znak. Ako je širina proslijeđena, tada čita potreban broj znakova i stavlja ih u niz BEZ terminalnog znaka na kraju.
s Crta Čita sve znakove bez razmaka. Ako je navedena š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 ovisi o implementaciji, ali isti kao i kako printf izlazi s 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 Sprema 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.

#uključiti #uključiti void main () (int godina, mjesec, dan; međuspremnik znakova; 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 niz, ne više od 127 znakova. Prilikom čitanja u niz, ne morate pisati &, // jer je niz zamijenjen pokazivačem printf ("Unesite string ="); scanf ("% 127s", međuspremnik ); printf ("% s", međuspremnik); getch ( );)

Osim funkcija scanf i printf, postoji niz funkcija koje vam omogućuju primanje ulaznih podataka.

int gettch ()- vraća uneseni znak, ali ga ne ispisuje na konzolu. #uključiti #uključiti 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ćuje čitanje niza s razmacima. Unatoč činjenici da radi s datotekom, možete je koristiti za čitanje standardni tok ulazni. Njegova prednost u odnosu na gets je u tome što vam omogućuje specificiranje maksimalna veličina redak koji se čita i završava redak završnim znakom.

#uključiti #uključiti #uključiti void main () (spremnik za znakove; // Čitanje iz standardnih ulaznih fgetova (međuspremnik, 127, stdin); printf ("% s", međuspremnik); // Ovo može zamijeniti čekanje da se unese znak scanf ("1" );)

Nije cijeli set različite funkcije unos i izlaz znakova. Takvih funkcija ima puno, ali mnoge od njih nisu sigurne, stoga pažljivo pročitajte dokumentaciju prije korištenja.

] SCANF #include int scanf (format-string [[, argument ...]]); char * format-string. kontrolni niz formata. Opis. Scanf čita podatke iz stdin-a 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. znak razmaka "", tab \ t, novi redak "\ n". Za scanf, razmak se koristi za čitanje, ali ne i pamćenje, svih sljedećih unesenih znakova razmaka, do prvog znaka koji nije razmak. 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 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 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 - čita se 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.

Funkcija scanf () je procedura Opća namjena koji čita stdin tok i sprema informacije u varijablama koje su specificirane argumentima navedenim u popisu argumenata. Može čitati sve ugrađene vrste podataka i automatski ih pretvoriti u odgovarajući interni format.

C99 primjenjuje kvalifikator ograničenja na parametar formata.

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

  • specifikacije formata;
  • razmak znakova;
  • znakovi osim razmaka.

Specifikatori formata - kojima prethodi znak postotka (%) - govore vam koja će se vrsta podataka sljedeće čitati. Na primjer, specifikacija % s će pročitati niz, a % d će pročitati cjelobrojnu vrijednost. Niz formata se čita s lijeva na desno, a specificatori formata se podudaraju s argumentima navedenim na popisu argumenata. Ovi kodovi su prikazani u sljedećoj tablici.

Kod Ugovoreni sastanak
%a Čita vrijednost s pomičnim zarezom (samo C99)
%A Isto kao% kod (samo C99)
%S Čita jedan znak
% d Čita decimalni cijeli broj
% i Čita cijeli broj u bilo kojem formatu (decimalno, oktalno, heksadecimalno)
% 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 redak
%X Čita heksadecimalni broj
% X Slično kodu% x
%R Čita pokazivač
% n Prihvaća cjelobrojnu vrijednost jednaku broju do sada pročitanih znakova
% u Čita decimalni cijeli broj bez predznaka
% Traži skup znakova
%% Čita znak postotka

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

Ako koristite moderan prevodilac 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 s tipom podataka whcar_t. Modifikator l se također može koristiti s kodom formata s za označavanje pokazivača na dvobajtni niz znakova. Osim toga, modifikator l može se koristiti za izmjenu dvobajtnog skupa znakova koji se skenira.

Razmaci u nizu formata uzrokuju da scanf () preskoči jedan ili više znakova 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 () čita, ali ne i pohranjuje, 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 se navedeni znak ne pronađe, 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 redcima. Znakovi kao što su zarez, točka-zarez itd. nisu prepoznati kao razdjelnici. To znači da operater

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

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

* iza znaka % i prije koda formata čitat će podatke dati tip ali će zabraniti njihovu dodjelu. Stoga, operater

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

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

Naredbe za oblikovanje mogu sadržavati modifikator maksimalna duljina 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 u adresnu varijablu ne želite pročitati više od 20 znakova, upotrijebite 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 funkciji scanf () "zaustavljen". Nakon otkrivanja razmak znak unos podataka za polje može se završiti prije nego što se dosegne maksimalna duljina polja. U ovom slučaju, funkcija scanf () prelazi na čitanje sljedećeg polja.

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

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

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

Zapamtite da svi drugi likovi kontrolna linija Specifikatori bez formata (uključujući razmake, tabulatore i nove retke) koriste se za podudaranje i odbacivanje znakova iz ulaznog toka. Na primjer, ako ulazni tok izgleda kao 10t20, operator

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

stavit će 10 u x i 20 u y. Znak t se odbacuje jer se pojavljuje u kontrolnom retku.

Drugi način korištenja funkcije scanf () naziva se scanset. U tom 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. Otvor uglata zagrada mora odmah slijediti znak postotka. Na primjer, sljedeći skup skeniranih znakova označava da je potrebno pročitati samo znakove A, B i C.

% [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 će niz sadržavati niz pročitanih znakova završen nulom.

Ako je prvi znak u skupu znak za uznačavanje (^), tada dobivamo suprotan učinak: polje za unos se čita do prvog znaka iz zadanog skupa znakova, tj. znak caret uzrokuje da scanf () prihvati sve znakove koji nisu definirani u skupu.

Mnogi prevoditelji vam omogućuju da navedete raspon s 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 se dogodi pogreška prije dodjeljivanja prvog polja, scanf () vraća EOF.

C99 je dodao modifikatore formata u scanf ().

Verzija C99 dodaje nekoliko modifikatora formata za korištenje 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 bez predznaka. Modifikator ll također se može primijeniti na specifikacije d, i, o, i, x i n. To znači da je odgovarajući argument pokazivač na predznaku long long int ili neoznačenu long long int vrijednost.

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. Ove vrste su deklarirane u zaglavlju i služe za pohranjivanje cijelih brojeva što je duže moguće.

Modifikator formata z, 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. Ova vrsta je deklarirana 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. Ova vrsta je deklarirana u zaglavlju i služi za pohranjivanje vrijednosti razlike između dva pokazivača.

Funkcija printf () omogućuje ispis informacija na zaslon prilikom programiranja u načinu rada konzole. Ova funkcija definiran je 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 zaslon i može sadržavati posebne kontrolne znakove za prikaz varijabli. Nakon toga slijedi popis 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, funkcija printf () jednostavno ispisuje dati niz na zaslon monitora:

printf ("Zdravo svijet.");

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

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

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

Treba napomenuti da specifikacija "% d" daje samo cjelobrojne tipove varijabli, na primjer int. Druge specifikacije treba koristiti za deduciranje drugih tipova. Glavne vrste specifikacija navedene su u nastavku:

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

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

int broj_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:

broj_i = 5, broj_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 redak, ali u stupcu, tada se funkcija printf () mora prepisati na sljedeći način:

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

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

Za unos informacija s tipkovnice, prikladno 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 vrste ulaznih podataka i može sadržavati iste specifikacije kao funkcija printf (). Zatim, postoji popis neobaveznih argumenata. Listing 1.4 pokazuje kako scanf () radi.

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

#uključiti
int main ()
{
int starost;
težina plovka;
printf ("Unesite podatke o svojoj dobi:");
scanf (“% d”, & starost);
printf ("Unesite podatke o svojoj težini:");
scanf (“% f”, & težina);
printf (“Vaša dob =% d, vaša težina =% f”, dob, težina);

Vrati 0;
}

Glavna razlika između korištenja funkcije scanf () i printf () je znak & ispred naziva varijable u koju se zapisuju rezultati unosa.

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

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

Funkcija scanf () to tumači kao da očekuje da korisnik unese broj, zatim zarez, a zatim drugi broj. Sve se događa kao da trebate unijeti dva cijela broja na sljedeći način:

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

Vrhunski povezani članci