Kako podesiti pametne telefone i računare. Informativni portal

Scanf C funkcija: opis.

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 u dvostrukim navodnicima 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

Bulova logika je prvobitno ugrađena u računar, 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, tako da je u logičkim operacijama 0 LAŽ, a 1 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.

Molimo obustavite AdBlock na ovoj stranici.

Vratimo se na posljednju listu prethodnog koraka:

Listing 1.

#include int main (void) (int a, b, res; a = 10; b = 7; res = a + b; printf ("% d +% d =% d \ n", a, b, res); return 0;)

Glavni zadatak ovog koraka je naučiti kako dobiti podatke od korisnika.

Za to se može koristiti funkcija scanf. Ona je, kao i funkcija printf, opisana u datoteci zaglavlja stdio.h. Jer već smo ga povezali u prvom redu, onda možemo slobodno koristiti funkciju scanf u našem programu.

Slika 1. Opća sintaksa za scanf.

Dvostruki navodnici označavaju specifikaciju formata. Ovisno o tome u koju varijablu ćemo pohraniti unesenu vrijednost, trebamo koristiti odgovarajući specificator formata.

Osnovni specificatori formata:

% d- cijeli brojevi
% f- stvarni broj tipa float
% lf- realan broj tipa double (zapis lf iz long float)
% c- simbol

Imajte na umu da funkcija scanf koristi različite specifikacije formata za tipove float i double.

Nakon niza formata, potrebno je da navedete adresu varijable na koju želite da sačuvate podatke. Da biste označili adresu varijable, dovoljno je upisati znak & (ampersand) ispred njenog imena, kao na slici iznad.

Na kraju, napišimo program za sabiranje dva broja.

Listing 2.

#include int main (void) (int a, b, res; scanf ("% d", & a); // čitanje cijele vrijednosti u varijablu a scanf ("% d", & b); // čitanje cjelobrojne vrijednosti u varijablu b res = a + b; printf ("% d +% d =% d \ n", a, b, res); vrati 0;)

Kompilirajte i pokrenite ovaj program. Nakon što se program pokrene, čekaće da unesete podatke. Znamo koje podatke trebate unijeti, jer napisali smo ovaj program. Za ostale korisnike koji neće vidjeti programski kod, bilo bi lijepo da se na ekranu prikaže nagoveštaj koje podatke da unese. Pogledajte kako se to radi u sljedećem primjeru.

Ovaj program će biti koristan za one koji prate svoje zdravlje. Ovaj program izračunava vaš bazalni metabolizam koristeći Mifflin-Saint Geor formulu na osnovu podataka koje unesete (starost, visina i težina).

Listing 3.

#include int main (void) (int starost, visina, težina; duplo bov_m, bov_f; printf ("Vaš vozrast? (bog) \ n"); scanf ("% d", & age); // pročitaj cjelobrojnu vrijednost u varijabla starosti printf ("Vash rost? (cm) \ n"); scanf ("% d", & visina); // čitanje vrijednosti u varijablu visine printf ("Vash ves? (kg) \ n") ; scanf ("% d ", & težina); // pročitaj vrijednost u varijablu težina bov_m = 10 * težina + 6,25 * visina - 5 * starost + 5; bov_f = 10 * težina + 6,25 * visina - 5 * starost - 161; printf (" | BMR | \ n "); printf (" | muško | žensko | \ n "); printf (" |% 8.2f |% 8.2f | \ n ", bov_m, bov_f); return 0 ;)

U stvari, funkcija scanf je funkcija za unos formata. Gotovo je složeniji od printf-a. Ali pričati novajliji o posebnostima njenog posla znači uzaludno ga opterećivati ​​nepotrebnim informacijama. U ovoj fazi će vam ovo znanje biti dovoljno, a kada bude potrebno koristiti nešto više, možete sami shvatiti. Ili ću ti možda reći na nekoj lekciji.

Standardna biblioteka C / C ++ uključuje niz funkcija za čitanje i pisanje na konzolu (tastatura i monitor). Ove funkcije čitaju i pišu podatke kao jednostavan tok znakova.

Koncept toka (stream), koji se koristi u programiranju, usko je povezan sa uobičajenim, svakodnevnim razumijevanjem riječi. Ulazni tok se može uporediti sa cijevi kroz koju voda (informacija) ulazi u bazen (kompjuterska memorija), izlazni tok - s cijevi kroz koju voda izlazi iz bazena. Važna karakteristika ove cijevi je da se podaci mogu kretati samo u jednom smjeru u isto vrijeme. Čak i ako se ista cijev koristi za ulaz i izlaz, to se ne može dogoditi u isto vrijeme: da bi se promijenio smjer protoka, mora se zaustaviti, izvršiti neke radnje i tek tada se tok mora usmjeriti u suprotnom smjeru . Još jedna karakteristika potoka je da gotovo nikada ne presuši. Ponekad presuši, ali ovaj period ne može biti dug ako sistem ispravno funkcioniše.

Standardna izlazna funkcija printf ()

Funkcija printf () je standardna izlazna funkcija. Koristeći ovu funkciju, možete prikazati niz znakova, broj, vrijednost varijable...

Funkcija printf () ima prototip u datoteci stdio.h
int printf (char * kontrolni niz, ...);

Ako je uspješna, funkcija printf () vraća broj ispisanih znakova.

Kontrolni niz sadrži dvije vrste informacija: znakove, koji se štampaju direktno na ekran, i specifikacije formata, koji određuju kako da se prikazuju argumenti.

Funkcija printf () je formatirana izlazna funkcija. To znači da u parametrima funkcije morate specificirati format podataka koji će biti izlazni. Format podataka je naznačen specifikacijama formata. Specifikator formata počinje sa znakom % nakon kojeg slijedi kod formata.

Specifikatori formata:

%Sa simbol
% d cijeli decimalni broj
% i cijeli decimalni broj
% e decimalni broj u obliku x.xx e + xx
% E decimalni broj u obliku x.xx E + xx
% f
% F decimalni pokretni zarez xx.xxxx
% g % f ili% e, što je kraće
% G % F ili % E, šta god je kraće
% o oktalni broj
% s niz znakova
% u decimalni broj bez predznaka
% x heksadecimalni broj
% X heksadecimalni broj
%% simbol %
% str pokazivač
% n pokazivač

Dodatno, modifikatori l i h mogu se primijeniti na komande formatiranja.

% ld dugi int print
% hu kratki nepotpisani otisak
% Lf duga dvostruka štampa

U specifikaciji formata, preciznost (broj cifara nakon decimalnog zareza) može se navesti iza simbola %. Preciznost se postavlja na sljedeći način:% .n<код формата>... Gdje je n broj cifara iza decimalnog zareza, i<код формата>- jedan od gore navedenih kodova.

Na primjer, ako imamo varijablu x = 10,3563 tipa float i želimo prikazati njenu vrijednost s preciznošću do 3 znamenke nakon decimalnog zareza, tada bi trebali napisati:

printf ("Varijabla x =% .3f", x);

rezultat:
Varijabla x = 10,356

Takođe možete odrediti minimalnu marginu za štampanje. Ako je linija ili broj veći od navedene širine polja, tada se ispisuje cijeli red ili broj.

Na primjer, ako napišete:

printf ("% 5d", 20);

tada će rezultat biti sljedeći:
20

Imajte na umu da broj 20 nije ispisan od samog početka reda. Ako želite da se neiskorišteni prostori polja popune nulama, onda morate staviti znak 0 ispred širine polja.

Na primjer:

printf ("% 05d", 20);

rezultat:
00020

Pored specifikacija formata podataka, kontrolni niz može sadržavati kontrolne znakove:

\ b BS, donja rupa
\ f Nova stranica, prijevod stranice
\ n Novi red, prijelaz na red
\ r Povrat kočije
\ t Horizontalna kartica
\ v Vertikalna kartica
\" Dvostruki citat
\" Apostrof
\\ Povratna kosa crta
\0 Null karakter, null bajt
\ a Signal
\ N Oktalna konstanta
\ xN Heksadecimalna konstanta
\? Upitnik

Najčešće ćete koristiti znak \n. Pomoću ovog kontrolnog karaktera moći ćete pomicati liniju. Pogledajte primjere programa i sve ćete razumjeti.

Primjeri programa.

/ * Primjer 1 * /
#include

void main (void)
{
int a, b, c; // Deklarisanje varijabli a, b, c
a = 5;
b = 6;
c = 9;
printf ("a =% d, b =% d, c =% d", a, b, c);
}

Rezultat programa:
a = 5, b = 6, c = 9

/ * Primjer 2 * /
#include

void main (void)
{
float x, y, z;

X = 10,5;
y = 130,67;
z = 54;

Printf ("Koordinate objekta: x:%. 2f, y:%. 2f, z:%. 2f", x, y, z);
}

Rezultat programa:
Koordinate objekta: x: 10,50, y: 130,67, z: 54,00

/ * Primjer 3 * /
#include

void main ()
{
int x;

X = 5;
printf ("x =% d", x * 2);
}

Rezultat programa:
x = 10

/ * Primjer 4 * /
#include

void main (void)
{
printf ("\" Tekst u navodnicima \ "");
printf ("\ nSadržaj kiseonika: 100 %%");
}

Rezultat programa:
"Tekst pod navodnicima"
Sadržaj kiseonika: 100%

/ * Primjer 5 * /
#include

void main (void)
{
int a;

A = 11; // 11 decimala jednako je b heksadecimalno
printf ("a-dec =% d, a-hex =% X", a, a);
}

Rezultat programa:
a-dec = 11, a-hex = b

/ * Primjer 6 * /
#include

void main (void)
{
char ch1, ch2, ch3;

Ch1 = "A";
ch2 = "B";
ch3 = "C";

Printf ("% c% c% c", ch1, ch2, ch3);
}

Rezultat programa:
ABC

/ * Primjer 7 * /
#include

void main (void)
{
char * str = "Moj string.";

Printf ("Ovo je% s", str);
}

Rezultat programa:
Ovo je moja linija.

/ * Primjer 8 * /
#include

void main (void)
{
printf ("Zdravo! \ n"); // Nakon ispisa, bit će novi red - \ n
printf ("Zovem se Pavel."); // Ovo će biti ispisano u novom redu
}

Rezultat programa:
Zdravo!
Moje ime je Pavel.

Scanf () standardna funkcija unosa

Funkcija scanf () je formatirana funkcija unosa. Uz njegovu pomoć možete unositi podatke sa standardnog uređaja za unos (tastatura). Ulazni podaci mogu biti cijeli brojevi, brojevi s pomičnim zarezom, znakovi, nizovi i pokazivači.

Funkcija scanf () ima sljedeći prototip u datoteci stdio.h:
int scanf (char * kontrolni niz);

Funkcija vraća broj varijabli kojima je dodijeljena vrijednost.

Kontrolni niz sadrži tri vrste znakova: specifikacije formata, razmake i druge znakove. Specifikatori formata počinju sa% znakom.

Specifikatori formata:

Prilikom unosa niza pomoću funkcije scanf () (specifikator formata% s), string se unosi prije prvog razmaka !! one. ako unesete u red "Zdravo svijet!" koristeći funkciju scanf ().


scanf ("% s", str);

tada će se nakon unosa rezultujući string, koji će biti pohranjen u nizu str, sastojati od jedne riječi "Hello". FUNKCIJA UMETA RED PRED PRVOG RAZMAKA! Ako želite unositi redove s razmacima, onda koristite funkciju

char * dobija (char * buf);

Pomoću funkcije gets () možete unijeti pune nizove. Funkcija gets () čita znakove sa tastature sve dok se ne pojavi znak novog reda (\ n). Sam karakter novog reda pojavljuje se kada pritisnete enter. Funkcija vraća pokazivač na buf. buf je bafer (memorija) za ulazni niz.

Iako je gets () izvan okvira ovog članka, hajde da napišemo primjer programa koji vam omogućava da unesete cijeli red s tastature i prikažete ga na ekranu.

#include

void main (void)
{
char buffer; // niz (bafer) za ulazni niz

Gets (bafer); // unesite red i pritisnite enter
printf ("% s", bafer); // prikazuje unesenu liniju na ekranu
}

Još jedna važna napomena! Da biste unijeli podatke pomoću funkcije scanf (), morate im kao parametre proslijediti adrese varijabli, a ne same varijable. Da biste dobili adresu varijable, morate staviti znak & (ampersand) ispred imena varijable. Znak & znači preuzimanje adrese.

Šta znači adresa? Pokušaću da objasnim. Imamo varijablu u programu. Varijabla pohranjuje svoju vrijednost u memoriju računara. Dakle, adresa koju dobijamo sa & je adresa u memoriji računara gde je pohranjena vrednost varijable.

Pogledajmo primjer programa koji nam pokazuje kako koristiti &

#include

void main (void)
{
int x;

Printf ("Unesite varijablu x:");
scanf ("% d", & x);
printf ("Varijabla x =% d", x);
}

Sada se vratimo na scanf () kontrolnu liniju. opet:

int scanf (char * kontrolni niz);

Znak za razmak u kontrolnoj liniji upućuje da se preskoči jedan ili više razmaka u ulaznom toku. Osim razmaka, može se uočiti tabulator ili znak novog reda. Znak različit od nule označava čitanje i odbacivanje ovog znaka.

Ograničenja između dva unesena broja su razmak, tabulator ili novi red. Znak * iza % i prije koda formata (specifikator formata) upućuje na čitanje podataka navedenog tipa, ali ne dodjeljuje ovu vrijednost.

Na primjer:

scanf ("% d% * c% d", & i, & j);

upisivanjem 50 + 20 postavit će se i na 50, j na 20, a + će biti pročitan i zanemaren.

Naredba format može odrediti najveću širinu polja za čitanje.

Na primjer:

scanf ("% 5s", str);

označava da li treba pročitati prvih 5 znakova iz ulaznog toka. Ako unesete 1234567890ABC, str niz će sadržavati samo 12345, a ostali znakovi će biti zanemareni. Razdjelnici: razmak, tabulator i novi red - kada se ukucaju, tretiraju se kao i svi ostali znakovi.

Ako se u kontrolnom nizu nađu bilo koji drugi znakovi, oni su namijenjeni da identifikuju i preskoče odgovarajući znak. Tok znakova 10plus20 po operateru

scanf ("% dplus% d", & x, & y);

će postaviti x na 10, y na 20 i preskočiti znakove plus jer se pojavljuju u kontrolnoj liniji.

Jedna od moćnih karakteristika funkcije scanf () je mogućnost specificiranja skupa skeniranja. Skup za pretraživanje definira skup znakova s ​​kojim će se upoređivati ​​znakovi pročitani funkcijom scanf (). Funkcija scanf () čita znakove sve dok se pojavljuju u skupu pretraživanja. Čim se uneseni znak ne pojavi u skupu pretraživanja, scanf () prelazi na sljedeći specificator formata. Skup pretraga je određen listom znakova u uglastim zagradama. Otvorenoj zagradi prethodi znak %. Pogledajmo ovo na primjeru.

#include

void main (void)
{
char str1, str2;
scanf ("%% s", str1, str2);
printf ("\ n% s \ n% s", str1, str2);
}
Hajde da predstavimo skup simbola:
12345abcdefg456

Na ekranu će program prikazati:
12345
abcdefg456

Kada navedete skup pretraga, možete koristiti i znak crtice da odredite razmak, kao i maksimalnu širinu polja za unos.

scanf ("% 10", str1);

Također možete definirati znakove koji nisu uključeni u skup pretraživanja. Prvom od ovih znakova prethodi ^. Skup znakova razlikuje mala i velika slova.

Dozvolite mi da vas podsjetim da kada koristite funkciju scanf (), morate joj proslijediti adrese varijabli kao parametre. Kod iznad je napisan:

char str; // niz od 80 znakova
scanf ("% s", str);

Imajte na umu da str ne prethodi &. To je zato što je str niz, a ime niza, str, je pokazivač na prvi element niza. Stoga se znak & ne koristi. Već prosljeđujemo adresu scanf-u (). Pa, jednostavno rečeno, str je adresa u memoriji računara na kojoj će biti pohranjena vrijednost prvog elementa niza.

Primjeri programa.

Primjer 1.
Ovaj program prikazuje upit "Koliko imaš godina?:" i čeka da se unesu podaci. Ako, na primjer, unesete broj 20, program će prikazati redak "Imate 20 godina". Prilikom pozivanja funkcije scanf () stavljamo znak & ispred varijable age, pošto funkcija scanf () treba adrese varijabli. Funkcija scanf () će zapisati unesenu vrijednost na navedenu adresu. U našem slučaju, unesena vrijednost 20 biće upisana na adresu varijable starosti.

/ * Primjer 1 * /

#include

void main (void)
{
int age;

Printf ("\ nKoliko imaš godina?:");
scanf ("% d", & starost);
printf ("Imaš % d godina.", starost);
}

Primjer 2.
Program kalkulatora. Ovaj kalkulator može samo sabirati brojeve. Ako unesete 100 + 34, program će dati rezultat: 100 + 34 = 134.

/ * Primjer 2 * /

#include

void main (void)
{
int x, y;

Printf ("\ nKalkulator:");
scanf ("% d +% d", & x, & y);
printf ("\ n% d +% d =% d", x, y, x + y);
}

Primjer 3.
Ovaj primjer pokazuje kako postaviti širinu očitavanja. U našem primjeru, širina polja je pet znakova. Ako unesete niz sa velikim brojem znakova, tada će svi znakovi nakon 5. biti odbačeni. Obratite pažnju na poziv funkcije scanf (). Znak & ne prethodi imenu imena niza jer je ime niza adresa prvog elementa u nizu.

/ * Primjer 3 * /

#include

void main (void)
{
char ime;

Printf ("\ nUnesite svoje korisničko ime (ne više od 5 karaktera):");
scanf ("% 5s", ime);
printf ("\ nUneli ste% s", ime);
}

Primjer 4.
Posljednji primjer u ovom članku pokazuje kako možete koristiti višestruka pretraživanja. Nakon pokretanja programa unesite broj od 2 do 5.

/ * Primjer 4 * /

#include

void main (void)
{
char bal;

Printf ("Vaša ocjena je 2,3,4,5:");
scanf ("%", & bal);
printf ("\ nEvaluation% c", bal);
}

Funkcija scanf () je rutina za unos opće namjene koja čita podatke iz stdin toka. Može čitati podatke svih osnovnih tipova i automatski ih pretvarati 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: Kodovi formata za scanf ()
Šifra Značenje
%Sa Brojite jedan znak
% d
% i Čitanje cjelobrojne decimale
% 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 specijalnih znakova 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.

Prisustvo regularnog znaka 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 maksimalne širine 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 maksimalne dužine polja ako se naiđe na prazno polje. 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. Prvoj uglastoj zagradi prethodi 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:

Mnogo skeniranja razlikuje velika 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 suzbijanje 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 eksplicitnim specificiranjem veličine svakog pokazivača koji se koristi prilikom poziva scanf (). Bliski pokazivač je određen modifikatorom N, a pokazivač udaljenim F modifikatorom (Ne možete koristiti N modifikator ako je program kompajliran za model ogromne memorije.)

] 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 vrijednosti navedenog tipa, pri čemu su vrijednosti 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 pomoću drugog argumenta; i tako dalje do kraja niza formatiranja. Polje za unos je ograničeno prvim znakom "razmaka", ili prvim znakom koji se ne može konvertovati u navedeni format, ili slučajem dostizanja polja širine koje 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 opcionog polja za format identificira tip polja za unos kao znak, niz ili broj. Najjednostavniji format BOM sadrži samo znak za postotak 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 pojavljuje automatski. 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.

Top srodni članci