Si të konfiguroni telefonat inteligjentë dhe PC. Portali informativ

Funksioni Scanf C: përshkrim.

Sa mirë është kur jepen të gjitha të dhënat, dhe asgjë nuk duhet të futet. Por, më besoni, kjo praktikisht nuk ndodh. Mos harroni shkollën, kur keni matur disa gjëra, dhe më pas vlerat e marra janë futur në formulat e nevojshme.

scanf

Në gjuhën C, përveç funksionit të daljes printf, ekziston edhe funksioni i skanimit për të dhëna. Këtu është funksioni i skanimit tani dhe ne do të hedhim një vështrim më të afërt:

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

Duket shumë e ngjashme me funksionin printf. Gjithashtu në thonjëza të dyfishta specifikuesi i formatit, por ndryshimi është në pjesën e dytë të funksionit. E keni vënë re pamjen e shenjës (&)? Pra, kjo shenjë nënkupton marrjen e adresës. Tani për tani unë do të shpjegoj pse kjo është e nevojshme.

Vlerën e futur duhet ta shkruajmë jo diku aty, por pikërisht në adresën në të cilën ndodhet ndryshorja jonë. ato. e panënshkruar (&) vlera jonë e futur do të shkojë në të gjitha vendet përveç asaj që na nevojitet. Prandaj, sa herë që duhet të futni vlera nga tastiera, vendosni një shenjë adrese (&) përpara variablit.

Specifikimi i formatit

Epo tani le të kalojmë specifikuesit e formatit:
  1. % d - lexoni numrin e plotë
  2. int i;
    scanf ("% d", & i);

  3. % o - lexoni numrin oktal
  4. int i;
    scanf ("% o", & i);

  5. % x - lexoni një numër heksadecimal
  6. int i;
    scanf ("% x", & i);

  7. % e (% f) - lexoni numrin real
  8. noton t;
    scanf ("% f", & t);

  9. % s - karakter i lexuar
  10. char ch;
    scanf ("% c", & ch);

  11. % s - lexoni rreshtin
  12. char * str ;;
    scanf ("% s", str);

    Mos u futni ende në punë me vargje. Pse nuk ka asnjë shenjë për marrjen e adresës? Ne do ta shqyrtojmë këtë temë pak më vonë.

Operacionet e krahasimit

Logjika Boolean fillimisht është e ngulitur në kompjuter, d.m.th. gjithçka është ndërtuar në 0 dhe 1. Nëse nuk e kuptoni se për çfarë bëhet fjalë, atëherë rishikoni filmin The Matrix, ku çdo mbrojtës i ekranit jeshil përbëhej nga këta dy numra magjikë.

Sigurisht, 0 dhe 1 janë të mira, por ne kemi nevojë për kuptim logjik, kështu që në operacionet boolean 0 është FALSE dhe 1 është TRUE. Këta koncepte E VËRTETË dhe E FALSE janë të lidhura ngushtë me operacionet e krahasimit... Për të filluar, këtu janë të gjitha llojet e operacioneve të krahasimit:

Në thelb, gabimi më i zakonshëm që bëjnë fillestarët është të ngatërrojnë operacionin me detyrën (=). operacion krahasimi(==). Këto janë gjëra krejtësisht të ndryshme. Por në fillim të kodimit, të gjithë kanë gabime pikërisht në këtë bazë, prandaj kini kujdes.

Ju lutemi pezulloni AdBlock në këtë sajt.

Le të kthehemi në listën e fundit të hapit të mëparshëm:

Listimi 1.

#përfshi int main (void) (int a, b, res; a = 10; b = 7; res = a + b; printf ("% d +% d =% d \ n", a, b, res); kthim 0;)

Detyra kryesore e këtij hapi është të mësoni se si të merrni të dhëna nga përdoruesi.

Për këtë mund të përdoret funksioni scanf. Ai, si funksioni printf, përshkruhet në skedarin e kokës stdio.h. Sepse e kemi të lidhur tashmë në rreshtin e parë, atëherë mund ta përdorim lirisht funksionin scanf në programin tonë.

Fig. 1. Sintaksë e përgjithshme për scanf.

Thomat e dyfishta tregojnë specifikuesin e formatit. Varësisht se në cilën variabël do të ruajmë vlerën e futur, duhet të përdorim specifikuesin e duhur të formatit.

Përcaktuesit bazë të formatit:

% d- numrat e plotë
% f- numri real i tipit float
% lf- një numër real i tipit të dyfishtë (shënimi lf nga notimi i gjatë)
% c- simbol

Vini re se funksioni scanf përdor specifikues të ndryshëm të formatit për llojet float dhe double.

Pas vargut të formatit, duhet të specifikoni adresën e ndryshores në të cilën dëshironi të ruani të dhënat. Për të treguar adresën e një ndryshoreje, mjafton që para emrit të shënoni shenjën & (ampersand), si në figurën e mësipërme.

Së fundi, le të shkruajmë një program për mbledhjen e dy numrave.

Listimi 2.

#përfshi int main (void) (int a, b, res; scanf ("% d", & a); // lexoni vlerën e numrit të plotë në ndryshore a scanf ("% d", & b); // lexoni vlerën e numrit të plotë në ndryshore b res = a + b; printf ("% d +% d =% d \ n", a, b, res); kthe 0;)

Përpiloni dhe ekzekutoni këtë program. Pas nisjes së programit, ai do të presë që ju të futni të dhëna. Ne e dimë se çfarë të dhënash duhet të futni, sepse ne kemi shkruar këtë program. Për përdoruesit e tjerë që nuk do ta shohin kodin e programit, do të ishte mirë të shfaqnin një sugjerim në ekran se cilat të dhëna duhet të futen. Shihni se si bëhet kjo në shembullin e mëposhtëm.

Ky program do të jetë i dobishëm për ata që monitorojnë shëndetin e tyre. Ky program llogarit normën tuaj bazë metabolike duke përdorur formulën Mifflin-Saint Geor bazuar në të dhënat që futni (mosha, gjatësia dhe pesha).

Listimi 3.

#përfshi int main (void) (int mosha, lartësia, pesha; dyfish bov_m, bov_f; printf ("Vash vozrast? (zot) \ n"); scanf ("% d", & mosha); // lexoni vlerën e numrit të plotë në variabla e moshës printf ("Vash rost? (cm) \ n"); scanf ("% d", & lartësi); // lexoni vlerën në variablin e lartësisë printf ("Vash ves? (kg) \ n") ; scanf ("% d ", & peshë); // lexoni vlerën në peshën e ndryshueshme bov_m = 10 * peshë + 6,25 * lartësi - 5 * mosha + 5; bov_f = 10 * peshë + 6,25 * lartësi - 5 * mosha - 161; printf (" | BMR | \ n "); printf (" | mashkull | femër | \ n "); printf (" |% 8.2f |% 8.2f | \ n ", bov_m, bov_f); kthimi 0 ;)

Në fakt, funksioni scanf është një funksion i hyrjes së formatit. Është pothuajse më kompleks se printf. Por t'i tregosh një fillestari për veçoritë e punës së saj do të thotë më kot ta ngarkosh atë me informacione të panevojshme. Në këtë fazë, kjo njohuri do të jetë e mjaftueshme për ju, dhe kur të bëhet e nevojshme të përdorni diçka më shumë, mund ta kuptoni vetë. Ose ndoshta do t'ju tregoj në ndonjë mësim.

Biblioteka standarde C / C ++ përfshin një numër funksionesh për lexim dhe shkrim në tastierë (tastierë dhe monitor). Këto funksione lexojnë dhe shkruajnë të dhëna si një rrjedhë e thjeshtë karakteresh.

Koncepti i një rryme (stream), i përdorur në programim, është i lidhur ngushtë me kuptimin e zakonshëm, të përditshëm të fjalës. Rrjedha hyrëse mund të krahasohet me një tub përmes të cilit uji (informacioni) hyn në pishinë (memoria e kompjuterit), rrjedha dalëse - me një tub përmes të cilit uji del nga pishina. Një tipar i rëndësishëm i këtij tubi është se të dhënat mund të lëvizin vetëm në një drejtim në të njëjtën kohë. Edhe nëse përdoret i njëjti tub për hyrje dhe dalje, kjo nuk mund të ndodhë në të njëjtën kohë: për të ndërruar drejtimin e rrjedhës, ai duhet të ndalet, duhet të kryhen disa veprime dhe vetëm atëherë rrjedha duhet të drejtohet në drejtim të kundërt. . Një veçori tjetër e rrjedhës është se pothuajse nuk thahet kurrë. Ndonjëherë thahet, por kjo periudhë nuk mund të jetë e gjatë nëse sistemi funksionon siç duhet.

Funksioni standard i daljes printf ()

Funksioni printf () është një funksion standard i daljes. Duke përdorur këtë funksion, ju mund të shfaqni një varg karakteresh, numër, vlerë të ndryshueshme ...

Funksioni printf () ka një prototip në skedarin stdio.h
int printf (char * varg kontrolli, ...);

Nëse është i suksesshëm, funksioni printf () kthen numrin e karaktereve të printuara.

Vargu i kontrollit përmban dy lloje informacioni: karaktere, të cilat printohen drejtpërdrejt në ekran dhe specifikues të formatit, të cilët përcaktojnë se si të shfaqen argumentet.

Funksioni printf () është një funksion dalës i formatuar. Kjo do të thotë që në parametrat e funksionit, duhet të specifikoni formatin e të dhënave që do të dalin. Formati i të dhënave tregohet nga specifikuesit e formatit. Specifikuesi i formatit fillon me një karakter% të ndjekur nga një kod formati.

Specifikimi i formatit:

%Me simbol
% d numër i plotë dhjetor
% i numër i plotë dhjetor
% e numër dhjetor në formën x.xx e + xx
% E numër dhjetor në formën x.xx E + xx
% f
% F presje dhjetore lundruese xx.xxxx
% g % f ose% e, cilado qoftë më e shkurtër
% G % F ose% E, cilado qoftë më e shkurtër
% o numër oktal
% s varg karakteresh
% u numër dhjetor i panënshkruar
% x numër heksadecimal
% X numër heksadecimal
%% simboli %
% fq tregues
% n tregues

Përveç kësaj, modifikuesit l dhe h mund të aplikohen për të formatuar komandat.

% ld printim i gjatë int
% hu printim i shkurtër i panënshkruar
% Lf printim i gjatë i dyfishtë

Në specifikuesin e formatit, një saktësi (numri i shifrave pas pikës dhjetore) mund të specifikohet pas simbolit %. Saktësia vendoset si më poshtë:% .n<код формата>... Ku n është numri i shifrave pas presjes dhjetore, dhe<код формата>- një nga kodet e dhëna më sipër.

Për shembull, nëse kemi një ndryshore x = 10.3563 të tipit float dhe duam të shfaqim vlerën e saj me saktësi deri në 3 shifra pas presjes dhjetore, atëherë duhet të shkruajmë:

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

Rezultati:
Variabli x = 10.356

Ju gjithashtu mund të specifikoni kufirin minimal të printueshëm. Nëse rreshti ose numri është më i madh se gjerësia e fushës së specifikuar, atëherë shtypet i gjithë rreshti ose numri.

Për shembull, nëse shkruani:

printf ("% 5d", 20);

atëherë rezultati do të jetë si më poshtë:
20

Vini re se numri 20 nuk ishte shtypur që në fillim të rreshtit. Nëse dëshironi që hapësirat e papërdorura të fushës të mbushen me zero, atëherë duhet të vendosni karakterin 0 përpara gjerësisë së fushës.

Për shembull:

printf ("% 05d", 20);

Rezultati:
00020

Përveç specifikuesve të formatit të të dhënave, vargu i kontrollit mund të përmbajë karaktere kontrolli:

\ b BS, vrima e poshtme
\ f Faqe e re, përkthim i faqes
\ n Linja e re, furnizimi i linjës
\ r Kthim ngarkese
\ t Skeda horizontale
\ v Skeda vertikale
\" Kuotim i dyfishtë
\" Apostrofë
\\ Vija e prapme
\0 Karakteri null, bajt null
\ a Sinjali
\ N Konstante oktale
\ xN Konstante heksadecimal
\? Pikëpyetje

Më shpesh do të përdorni karakterin \ n. Me këtë karakter kontrolli do të jeni në gjendje të rreshtoni furnizimin. Shikoni programet mostër dhe do të kuptoni gjithçka.

Shembuj të programeve.

/ * Shembulli 1 * /
#përfshi

kryesor i zbrazët (i zbrazët)
{
int a, b, c; // Deklarimi i variablave a, b, c
a = 5;
b = 6;
c = 9;
printf ("a =% d, b =% d, c =% d", a, b, c);
}

Rezultati i programit:
a = 5, b = 6, c = 9

/ * Shembulli 2 * /
#përfshi

kryesor i zbrazët (i zbrazët)
{
noton x, y, z;

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

Printf ("Koordinatat e objektit: x:%. 2f, y:%. 2f, z:%. 2f", x, y, z);
}

Rezultati i programit:
Koordinatat e objektit: x: 10.50, y: 130.67, z: 54.00

/ * Shembulli 3 * /
#përfshi

kryesore e zbrazët ()
{
int x;

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

Rezultati i programit:
x = 10

/ * Shembulli 4 * /
#përfshi

kryesor i zbrazët (i zbrazët)
{
printf ("\" Teksti në thonjëza \ "");
printf ("\ nPërmbajtja e oksigjenit: 100 %%");
}

Rezultati i programit:
"Teksti në thonjëza"
Përmbajtja e oksigjenit: 100%

/ * Shembulli 5 * /
#përfshi

kryesor i zbrazët (i zbrazët)
{
int a;

A = 11; // 11 dhjetore është e barabartë me b heksadecimal
printf ("a-dec =% d, a-hex =% X", a, a);
}

Rezultati i programit:
a-dec = 11, a-hex = b

/ * Shembulli 6 * /
#përfshi

kryesor i zbrazët (i zbrazët)
{
char ch1, ch2, ch3;

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

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

Rezultati i programit:
ABC

/ * Shembulli 7 * /
#përfshi

kryesor i zbrazët (i zbrazët)
{
char * str = "Vargu im.";

Printf ("Kjo është% s", str);
}

Rezultati i programit:
Kjo është linja ime.

/ * Shembulli 8 * /
#përfshi

kryesor i zbrazët (i zbrazët)
{
printf ("Përshëndetje! \ n"); // Pas printimit, do të ketë një linjë të re - \ n
printf ("Emri im është Pavel."); // Kjo do të printohet në një rresht të ri
}

Rezultati i programit:
Përshëndetje!
Emri im është Pavel.

Funksioni standard i hyrjes Scanf ().

Funksioni scanf () është një funksion hyrës i formatuar. Me ndihmën e tij, ju mund të futni të dhëna nga një pajisje standarde hyrëse (tastierë). Të dhënat hyrëse mund të jenë numra të plotë, numra me pikë lundruese, karaktere, vargje dhe tregues.

Funksioni scanf () ka prototipin e mëposhtëm në skedarin stdio.h:
int scanf (char * varg kontrolli);

Funksioni kthen numrin e variablave të cilave u është caktuar një vlerë.

Vargu i kontrollit përmban tre lloje karakteresh: specifikuesit e formatit, hapësirat dhe karaktere të tjera. Përcaktuesit e formatit fillojnë me një% karakter.

Specifikimi i formatit:

Kur futni një varg duke përdorur funksionin scanf () (specifikuesi i formatit% s), vargu futet përpara hapësirës së parë !! ato. nëse futni rreshtin "Përshëndetje botë!" duke përdorur funksionin scanf ().


scanf ("% s", str);

pastaj pas futjes vargu që rezulton, i cili do të ruhet në grupin str, do të përbëhet nga një fjalë "Përshëndetje". FUNKSIONI SHQYRT NJË RINJË PARA HAPËSIRËS SË PARË! Nëse dëshironi të futni rreshta me hapësira, atëherë përdorni funksionin

char * merr (char * buf);

Me funksionin gets (), mund të futni vargje të plota. Funksioni gets () lexon karaktere nga tastiera derisa të shfaqet një karakter i linjës së re (\ n). Vetë karakteri i linjës së re shfaqet kur shtypni enter. Funksioni kthen një tregues në buf. buf është një bufer (memorie) për vargun hyrës.

Megjithëse gets () është jashtë qëllimit të këtij artikulli, le të shkruajmë një program shembull që ju lejon të futni një rresht të tërë nga tastiera dhe ta shfaqni atë në ekran.

#përfshi

kryesor i zbrazët (i zbrazët)
{
char buffer; // grup (buffer) për vargun hyrës

Merr (bufer); // futni një rresht dhe shtypni enter
printf ("% s", buffer); // shfaq rreshtin e futur në ekran
}

Një tjetër shënim i rëndësishëm! Për të futur të dhëna duke përdorur funksionin scanf (), duhet t'i kaloni si parametra adresat e variablave dhe jo vetë variablat. Për të marrë adresën e një ndryshoreje, duhet të vendosni shenjën & (shqip) përpara emrit të ndryshores. Shenja & nënkupton marrjen e një adrese.

Çfarë do të thotë adresa? Do të përpiqem të shpjegoj. Ne kemi një variabël në program. Një ndryshore ruan vlerën e saj në memorien e kompjuterit. Pra, adresa që marrim me & është adresa në memorien e kompjuterit ku ruhet vlera e ndryshores.

Le të hedhim një vështrim në një program shembull që na tregon se si të përdorim &

#përfshi

kryesor i zbrazët (i zbrazët)
{
int x;

Printf ("Fut ndryshoren x:");
scanf ("% d", & x);
printf ("Variable x =% d", x);
}

Tani le të kthehemi te linja e kontrollit scanf (). Përsëri:

int scanf (char * varg kontrolli);

Një karakter hapësinor në një linjë kontrolli udhëzon të kapërceni një ose më shumë hapësira në rrjedhën hyrëse. Përveç një hapësire, mund të perceptohet një skedë ose karakter i linjës së re. Një karakter jozero tregon leximin dhe heqjen e këtij karakteri.

Kufizuesit midis dy numrave të futur janë hapësira, skeda ose rreshti i ri. * pas% dhe para kodit të formatit (specifikuesi i formatit) udhëzon të lexoni të dhënat e llojit të specifikuar, por të mos caktoni këtë vlerë.

Për shembull:

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

duke shtypur 50 + 20 do të vendosë i në 50, j në 20 dhe + do të lexohet dhe injorohet.

Komanda e formatit mund të specifikojë gjerësinë më të madhe të fushës për t'u lexuar.

Për shembull:

scanf ("% 5s", str);

tregon nëse duhen lexuar 5 karakteret e para nga rryma hyrëse. Nëse futni 1234567890ABC, grupi str do të përmbajë vetëm 12345, pjesa tjetër e karaktereve do të shpërfillen. Ndarësit: hapësira, skeda dhe rreshti i ri - kur shtypen, ato trajtohen si të gjithë karakteret e tjera.

Nëse gjenden ndonjë karakter tjetër në vargun e kontrollit, ato synojnë të identifikojnë dhe të kalojnë karakterin përkatës. Rrjedha e karaktereve 10 plus 20 nga operatori

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

do të vendosë x në 10, y në 20 dhe do të kapërcejë karakteret plus sepse ato shfaqen në vijën e kontrollit.

Një nga veçoritë e fuqishme të funksionit scanf () është aftësia për të specifikuar një grup skaner. Grupi i kërkimit përcakton grupin e karaktereve me të cilin do të krahasohen karakteret e lexuara nga funksioni scanf (). Funksioni scanf () lexon karakteret për aq kohë sa ato ndodhin në grupin e kërkimit. Sapo karakteri që futet nuk shfaqet në grupin e kërkimit, scanf () vazhdon te specifikuesi tjetër i formatit. Grupi i kërkimeve përcaktohet nga një listë karakteresh të mbyllura në kllapa katrore. Një kllapa e hapur paraprihet nga një shenjë %. Le ta shohim këtë me një shembull.

#përfshi

kryesor i zbrazët (i zbrazët)
{
char str1, str2;
scanf ("%% s", str1, str2);
printf ("\ n% s \ n% s", str1, str2);
}
Le të prezantojmë një grup simbolesh:
12345abcdefg456

Në ekran, programi do të shfaqë:
12345
abcdefg456

Kur specifikoni një grup kërkimesh, mund të përdorni gjithashtu karakterin vizë për të specifikuar hapësirën, si dhe gjerësinë maksimale të fushës së hyrjes.

scanf ("% 10", str1);

Ju gjithashtu mund të përcaktoni karaktere që nuk përfshihen në grupin e kërkimit. I pari prej këtyre karaktereve paraprihet nga një ^. Kompleti i karaktereve bën dallimin midis shkronjave të vogla dhe të mëdha.

Më lejoni t'ju kujtoj se kur përdorni funksionin scanf (), duhet t'i kaloni adresat e variablave në të si parametra. Kodi i mësipërm ishte shkruar:

char str; // një grup prej 80 karakteresh
scanf ("% s", str);

Vini re se str nuk paraprihet nga &. Kjo ndodh sepse str është një grup, dhe emri i grupit, str, është një tregues për elementin e parë të grupit. Prandaj, shenja & nuk përdoret. Tashmë po e kalojmë adresën në scanf (). E thënë thjesht, str është adresa në kujtesën e kompjuterit ku do të ruhet vlera e elementit të parë të grupit.

Shembuj të programeve.

Shembulli 1.
Ky program shfaq pyetjen "Sa vjeç je?:" dhe pret që të futen të dhënat. Nëse, për shembull, futni numrin 20, programi do të shfaq rreshtin "Ju jeni 20 vjeç". Kur thërrasim funksionin scanf (), vendosim shenjën & përpara ndryshores moshe, pasi funksioni scanf () ka nevojë për adresat e variablave. Funksioni scanf () do të shkruajë vlerën e futur në adresën e specifikuar. Në rastin tonë, vlera e futur 20 do të shkruhet në adresën e moshës së ndryshueshme.

/ * Shembulli 1 * /

#përfshi

kryesor i zbrazët (i zbrazët)
{
mosha int;

Printf ("\ nsa vjeç jeni?:");
scanf ("% d", & mosha);
printf ("Ju jeni% d vjeç.", mosha);
}

Shembulli 2.
Programi llogaritës. Ky kalkulator mund të shtojë vetëm numra. Nëse vendosni 100 + 34, programi do të japë rezultatin: 100 + 34 = 134.

/ * Shembulli 2 * /

#përfshi

kryesor i zbrazët (i zbrazët)
{
int x, y;

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

Shembulli 3.
Ky shembull tregon se si të vendosni gjerësinë e leximit. Në shembullin tonë, gjerësia e fushës është pesë karaktere. Nëse futni një varg me një numër të madh karakteresh, atëherë të gjithë karakteret pas 5-tës do të hidhen poshtë. Vini re thirrjen e funksionit scanf (). Shenja & nuk i paraprin emrit të grupit sepse emri i grupit është adresa e elementit të parë në grup.

/ * Shembulli 3 * /

#përfshi

kryesor i zbrazët (i zbrazët)
{
emri char;

Printf ("\ nFutni emrin tuaj të përdoruesit (jo më shumë se 5 karaktere):");
scanf ("% 5s", emri);
printf ("\ nKeni futur% s", emrin);
}

Shembulli 4.
Shembulli i fundit në këtë artikull tregon se si mund të përdorni kërkime të shumta. Pas fillimit të programit, vendosni një numër nga 2 në 5.

/ * Shembulli 4 * /

#përfshi

kryesor i zbrazët (i zbrazët)
{
char bal;

Printf ("Vlerësimi juaj është 2,3,4,5:");
scanf ("%", & bal);
printf ("\ nVlerësimi% c", bal);
}

Funksioni scanf () është një rutinë hyrëse për qëllime të përgjithshme që lexon të dhëna nga transmetimi stdin. Mund të lexojë të dhëna të të gjitha llojeve bazë dhe t'i konvertojë ato automatikisht në formatin e brendshëm të dëshiruar. Nëse printf () po bënte hyrje dhe jo dalje, mund të quhej një analog i scanf ().

Vargu i kontrollit i treguar sipas formatit përbëhet nga tre lloje karakteresh:

  • Specifikimi i formatit
  • Simbole të veçanta
  • Personazhe të tjerë (jo të veçantë)

Përcaktuesit e formatit ndjekin karakterin përqindje dhe i tregojnë scanf () se çfarë lloji të të dhënave të lexojë më pas. Kodet e specifikuesit janë paraqitur në tabelë.

Tabela: Formati i kodeve për scanf ()
Kodi Kuptimi
%Me Numëroni një personazh
% d
% i Lexoni numrin e plotë dhjetor
% e
% f Lexoni numrin me pikë lundruese
% g Lexoni numrin me pikë lundruese
%O Numëroni numrin oktal
% s Lexoni rreshtin
%X Lexoni numrin heksadecimal
%R Lexoni treguesin
% n Pranon një vlerë të plotë të barabartë me numrin e karaktereve të lexuara deri në momentin aktual
% u Lexon një numër të plotë të panënshkruar
% Kërkon një grup karakteresh
%% Lexon karakterin %

Për shembull,% s lexon një varg dhe% d lexon një ndryshore numër të plotë.

Vargu i formatit lexohet nga e majta në të djathtë, duke bërë një hartë midis kodeve të formatit dhe argumenteve nga lista e argumenteve.

Karakteret speciale në vargun e kontrollit bëjnë që scanf () të kapërcejë një ose më shumë karaktere speciale në rrjedhën hyrëse. Karakteret speciale janë hapësira, skeda ose rreshti i ri. Një karakter i vetëm i veçantë në një linjë kontrolli bën që scanf () të lexojë, pa mbajtur mend, ndonjë numër (përfshirë zero) të karaktereve speciale të njëpasnjëshme nga rrjedha hyrëse, derisa të ndeshet një karakter jo i veçantë.

Prania e një karakteri të rregullt bën që scanf () të lexojë dhe të heqë karakterin përkatës. Për shembull, "% d,% d" bën që scanf () të lexojë një numër të plotë, të lexojë dhe të heqë presjen dhe më pas të lexojë një numër tjetër të plotë. Nëse karakteri i specifikuar nuk gjendet në rrjedhën hyrëse, scanf () ndalon.

Të gjitha variablat e përdorur për të marrë vlera duke përdorur funksionin scanf () duhet të kërkohen nga adresat e tyre. Kjo do të thotë që të gjitha argumentet e funksionit duhet të jenë tregues drejt variablave. Kështu, C bën të mundur kalimin me referencë, dhe kjo lejon funksionin të ndryshojë përmbajtjen e argumentit.

Scanf ("% d", & count);

Vargjet lexohen në vargje karakteresh dhe emri i grupit, pa asnjë tregues, është adresa e elementit të parë në grup. Prandaj, për të lexuar një varg në grupin e karaktereve të adresës, mund të përdorni komandën

Scanf ("% s", adresa);

Në këtë rast, adresa e emrit është tashmë një tregues dhe nuk ka nevojë për prefiksin &.

Artikujt e të dhënave hyrëse duhet të ndahen me hapësira, skeda ose rreshta të rinj.
Karakteret e pikësimit si presja, pikëpresja etj. nuk konsiderohen si kufizues. Kjo do të thotë se për operatorin

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

Sekuenca 10 20 do të pranohet, por sekuenca 10.20 jo. Përcaktuesit e formatit scanf () janë në të njëjtin rend si variablat në listën e argumenteve të cilave u janë caktuar vlerat e variablave të marra.

* pas% dhe para specifikuesit të formatit lexon të dhëna të llojit të specifikuar, por shtyp caktimin. Pra kodi

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

Kur futni sekuencën, 10/20 cakton 10 në x, hedh poshtë / dhe cakton 20 për y.

Komandat e formatimit mund të vendosin modifikuesin e gjerësisë maksimale të fushës. Është një numër i plotë që vendoset midis shenjës % dhe specifikuesit të formatit. Kufizon numrin e karaktereve të lexuara për çdo fushë. Për shembull, nëse duhet të lexoni jo më shumë se 20 karaktere në grupin e adresave, do të shkruani

Scanf ("% 20s", adresa);

Nëse transmetimi i hyrjes përmban më shumë se 20 karaktere, atëherë në një telefonatë pasuese, funksioni i hyrjes do të nisë hyrjen nga pika ku hyrja u ndal gjatë thirrjes aktuale. Futja e fushës mund të ndërpritet përpara se të arrihet gjatësia maksimale e fushës nëse haset një bosh. Në këtë rast scanf () kalon në fushën tjetër.

Megjithëse hapësirat, skedat dhe vijat e reja përdoren si ndarës të fushave, ato lexohen si çdo karakter tjetër kur futet një karakter i vetëm. Për shembull, duke pasur parasysh një rrymë hyrëse x y, funksioni

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

Do të vendos karakterin x në ndryshoren a, hapësirën - në ndryshoren b dhe y - në ndryshoren c.

Kini kujdes: çdo karakter tjetër në linjën e kontrollit - duke përfshirë hapësirat, skedat dhe rreshtat e rinj - përdoren për të specifikuar dhe hequr karakteret nga rrjedha e hyrjes. Për shembull, për një rrymë hyrëse prej 10t20, funksioni

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

Vendet 10 në x dhe 20 në y. T do të hidhet poshtë sepse ka një t në linjën e kontrollit.

Një veçori tjetër e funksionit scanf () quhet skanime të shumëfishta. Seti i skanimit përcakton karakteret që do të lexohen nga funksioni scanf () dhe do t'u caktohen elementeve të grupit përkatës të karaktereve. Për të specifikuar një grup skanimesh, duhet të vendosni karakteret, të cilat janë të vlefshme, në kllapa katrore. Kllapa e parë katrore paraprihet nga një shenjë përqindjeje. Për shembull, lista e mëposhtme e grupeve të skanimit specifikon që scanf () lexon vetëm karakteret A, B dhe C:

Argumenti që korrespondon me listën e grupit të skanimit duhet të jetë një tregues për një grup karakteresh. Kur përdorni skanime të shumta, funksioni scanf () lexon karakteret dhe i vendos ato në grupin e specifikuar derisa të haset një karakter që nuk përfshihet në grupin e skanimit (d.m.th., lexohen vetëm karakteret e përfshira në grupin e skanimit).

Vargu i kthyer nga scanf () do të përmbajë një varg të përfunduar me null. Lista e simboleve të lexueshme mund të vendoset edhe në formë të kundërt. Për ta bërë këtë, vendosni ^ si karakterin e parë. Pastaj scanf () do të pranojë çdo karakter që nuk përfshihet në grupin e skanimit.

Duke përdorur thonjëza, mund të specifikoni gamën e karaktereve që do të interpretohen. Për shembull, shprehja e mëposhtme udhëzon scanf () të pranojë shkronjat A deri në Z:

Shumë skanime bëjnë dallimin midis shkronjave të mëdha dhe të vogla. Nëse dëshironi që scanf () t'i pranojë të dyja, duhet t'i renditni veçmas në grupin e skanimeve.

Funksioni scanf () kthen një numër të barabartë me numrin e fushave, vlerat e të cilave në fakt u janë caktuar variablave. Ky numër nuk përfshin fushat që janë lexuar, por vlerat e tyre nuk janë caktuar për asgjë për shkak të përdorimit të modifikuesit * për të shtypur detyrën. Nëse ndodh një gabim përpara caktimit të një vlere në fushën e parë, EOF kthehet.

Kur përdorni Borland C ++ në një mjedis 16-bitësh, mund të ndryshoni modelin e paracaktuar të memories për përpilimin e programit tuaj duke specifikuar në mënyrë eksplicite madhësinë e secilit tregues të përdorur kur thërrisni scanf (). Treguesi i afërt specifikohet nga modifikuesi N dhe treguesi larg specifikohet nga modifikuesi F (Nuk mund të përdorni modifikuesin N nëse programi është përpiluar për modelin e memories së madhe.)

] SCANF #përfshi int scanf (format-string [[, argument ...]]); char * format-string. vargu i kontrollit të formatit. Përshkrim. Scanf lexon të dhënat nga stdin në vendndodhjen e specifikuar nga argumentet. Çdo argument duhet të jetë një tregues për një vlerë me një lloj që përputhet me llojin e specifikuar në vargun e formatit. Vargu i formatit kontrollon transformimet e fushave hyrëse. Ky varg mund të përmbajë sa vijon: karakteret "Whitespace", d.m.th. karakteri i hapësirës "", tab \ t, rreshti i ri "\ n". Për scanf, një karakter hapësinor përdoret për të lexuar, por jo për të mbajtur mend, të gjitha karakteret pasuese të hapësirës të futura, deri në karakterin e parë jo hapësinor. Ndërsa shkruani, një karakter hapësirë ​​në vargun e formatit përputhet me çdo numër, duke përfshirë 0, ose çdo kombinim të karaktereve të hapësirës. Çdo karakter kontrolli përveç hapësirës dhe karakterit të shenjës përqindje. Pastaj ky simbol për funksionin scanf përcaktohet duke lexuar, por pa ruajtur simbolet përkatëse të kontrollit. Nëse personazhi tjetër në nuk përputhet me karakteret e kontrollit, atëherë scanf del. Specifikimi i formatit është futur me shenjën %. Në këtë rast, scanf lexon dhe konverton karakteret e futura në vlerat e llojit të specifikuar, me vlerat e përcaktuara nga argumentet përkatëse nga lista e argumenteve. Vargu i formatit lexohet nga e majta në të djathtë. Karakteret jashtë specifikimit të formatit supozohet se janë në përputhje me sekuencën e karaktereve në rrjedhën stdin; këto karaktere të përputhura në stdin skanohen por nuk mbahen mend. Nëse një karakter në stdin bie ndesh me vargun e formatit, scanf del. Ky karakter kundërshtues mbetet në stdin sepse nuk mund të lexohet. Kur ndeshet specifikimi i parë i formatit, atëherë vlera e fushës së parë hyrëse konvertohet sipas specifikimit të formatit dhe ruhet në vendndodhjen e specifikuar nga argumenti i parë. Sipas specifikimit të formatit të dytë, fusha e dytë e hyrjes konvertohet dhe ruhet nga argumenti i dytë; dhe kështu me radhë deri në fund të vargut të formatit. Fusha e hyrjes kufizohet nga karakteri i parë "hapësirë ​​i bardhë", ose karakteri i parë që nuk mund të konvertohet në formatin e specifikuar, ose rasti i arritjes së fushës së gjerësisë që vjen e para. Nëse për specifikimin e formatit të zgjedhur jepen më shumë argumente sesa kërkohen, atëherë argumentet shtesë shpërfillen. Specifikimi i formatit merr formën e mëposhtme. % <.precision><{F:N:h:I}> ... Çdo fushë në formatin BOM është një karakter ose numër i veçantë që shpreh një opsion të veçantë formati. Karakteri i tipit që shfaqet pas fushës së fundit të formatit opsional, identifikon llojin e fushës së hyrjes si karakter, varg ose numerik. Formati më i thjeshtë BOM përmban vetëm një shenjë përqindjeje dhe një simbol tipi (për shembull,% S). Çdo fushë e specifikimit të formatit përshkruhet më poshtë. Nëse shenja e përqindjes% pasohet nga një karakter që nuk është karakter i kontrollit të formatit, atëherë ky karakter dhe karakteret pas tij, deri në shenjën tjetër% trajtohen si një sekuencë e rregullt karakteresh, d.m.th. sekuenca që do të futet. Për shembull, për të futur karakterin e shenjës %, përdorni %%. Ylli (*) pas shenjës % e shtyp përcaktimin e fushës së hyrjes tjetër, e cila specifikohet si fushë e specifikuar sipas llojit. Kjo fushë është skanuar, por nuk mbahet mend. Widht është një numër i plotë dhjetor pozitiv dhe kontrollon numrin maksimal të karaktereve të lexuara nga stdin. Vetëm ato karaktere që nuk e kalojnë gjerësinë transformohen dhe mbahen mend me argumentin përkatës. Nëse ka karaktere të hapësirës së bardhë në gjerësi, d.m.th. karakteret e hapësirës, ​​skedës ose linjës së re, ato nuk konvertohen në formatin e zgjedhur derisa të arrihet gjerësia. Prefikset opsionale F dhe N nuk respektojnë konventën e adresimit të paracaktuar të modeleve të memories së përdorur. F mund të jetë një parashtesë e argumentit që tregon një objekt të largët; dhe N në objektin e afërt. Prefiksi opsional l tregon se versioni i gjatë është duke u përdorur; dhe prefiksi h tregon përdorimin e versionit të shkurtër. Argumenti përkatës tregon një objekt të gjatë ose të dyfishtë (duke përdorur prefiksin l) ose një objekt të shkurtër (duke përdorur parashtesën h). Modifikuesit l dhe h mund të përdoren së bashku me llojet e karaktereve d, i, o, x, u. Modifikuesi l mund të përdoret gjithashtu me karakteret e tipit e dhe f. Nëse specifikohet ndonjë lloj tjetër, modifikuesit l dhe h shpërfillen. Simbolet e tipit dhe kuptimet e tyre janë përshkruar në tabelën R.4. TABELA R.4 Llojet e karaktereve të skanfit KARAKTERI LLOJI I SUGJERUAR LLOJI I ARGUMENTIT TË HYRJES d tregues i plotë dhjetor në int. D tregues i numërit të plotë dhjetor në të gjatë. o tregues i numrit të plotë oktal në int. O tregues i numrit të plotë oktal në të gjatë. x është një tregues gjashtëkëndor në një int. tregues i plotë X gjashtëkëndor në të gjatë. numër i plotë i dhjetor, i teti është një tregues për int. masë ose numër i plotë heksadecimal I dhjetor, tregues oktal në gjatësi. një numër i plotë i bashkuar ose heksadecimal u tregues dhjetor i panënshkruar në një int numër të plotë të panënshkruar. U tregues dhjetor i panënshkruar në numër të plotë të panënshkruar gjatë. e është një vlerë me pikë lundruese, një tregues në një pikë f float, që përmban një shenjë opsionale ("+", "-"), një ose më shumë shifra dhjetore, që zakonisht përmbajnë një pikë dhjetore dhe një eksponent ("e ", E "), e cila shkruhet pas një vlere të plotë të nënshkruar. c karakter. Një tregues karakteri në char. Karakteret e hapësirës, ​​skedës ose linjës së re, të ashtuquajturat "hapësira e bardhë", të cilat zakonisht shpërfillen, lexohen kur specifikohet ky lloj. % 1s përdoret për të lexuar karakterin tjetër jo të bardhë. s varg. një tregues drejt një grupi karakteresh mjaft të madh për fushën e hyrjes së bashku me një terminator null "\ 0" që shfaqet automatikisht. n leximi në hyrje të një treguesi në int, në nga transmetimi ose nga i cili është shkruar buffer, por numërohet me sukses. karaktere nga një transmetim ose buffer, deri dhe duke përfshirë ato të specifikuara në thirrjen e skanimit. vlera p në formën e treguesit në larg- xxxx: yyyy, ku është grupi i të dhënave. shifrat x dhe y janë shifra heksadecimale të mëdha. Kur lexoni vargje të pakufizuara me karaktere të hapësirës së bardhë, grupi i karaktereve në kllapa katrore duhet të zëvendësohet me llojin e vargut s. Fusha përkatëse e hyrjes lexohet deri në karakterin e parë që nuk gjendet në grupin e karaktereve të kufizuar me kllapa katrore. Nëse karakteri i parë në këtë grup është caret (^), rezultati ruhet: fusha e hyrjes lexohet deri në karakterin e parë që nuk përfshihet në këtë grup karakteresh. Për të kujtuar një varg pa karakterin null "\ 0", përdoret specifikimi% nc, ku n është një numër i plotë dhjetor. Në këtë rast, tipi i karakterit s përcakton një argument që tregon një grup karakteresh. N karakteret e ardhshme lexohen nga rryma hyrëse në vendndodhjen e specifikuar dhe karakteri null nuk shkruhet. Funksioni scanf skanon karakter për karakter për secilën fushë hyrëse. Mund të përfundojë leximin e një fushe të vetme kur të arrijë një karakter hapësinor, nëse arrihet njëra nga fusha e gjerësisë; ose karakteri tjetër i hyrjes nuk mund të konvertohet në formatin e specifikuar; ose karakteri tjetër bie ndesh me karakterin e tij përkatës në vargun e kontrollit të formatit; ose karakteri tjetër mungon nga grupi i karaktereve të zgjedhur. Kur ndodh procesi i diktuar i përfundimit të leximit, fusha tjetër e hyrjes konsiderohet që nga karakteri i parë konfliktual. Ky karakter, nëse ka një, trajtohet si i palexuar, ose si karakteri i parë i fushës së hyrjes tjetër, ose si karakteri i parë në leximet e mëvonshme nga rrjedha stdin. Vlera e kthimit. Ky funksion kthen numrin e fushave të konvertuara dhe të caktuara me sukses. Vlera e kthyer nuk përmban numrin e fushave të lexuara por të pacaktuara. EOF kthehet kur përpiqet të lexojë fundin e skedarit. Një vlerë e kthyer prej 0 tregon se nuk ka fusha të caktuara. Shihni gjithashtu fscanf, printf, sscanf, vfprintf, vprintf, vsprintf. Shembulli 1. #include int i; float fp; char c, s; scanf ("% d% f% c% s", & i, & fp, & c, s); / * futja e të dhënave të ndryshme * /. Shembulli 2. #include kryesore () / * konverto numrin heksadecimal ** ose oktal në ** numër të plotë dhjetor * / (int numcaktuar, val; pintf ("Fut numrin heksadecimal ose oktal, ose 00 në guit: \ n"); bëj (printf ("# = "); numassigned = scanf ("% i ", & val); printf (" dhjetore # =% i \ n ", nal);) ndërsa (val && numcaktuar); / * fundi i ciklit nëse vlera e hyrjes është 00 , ose nëse scanf nuk është në gjendje të caktojë fushën * /.) Atëherë dalja do të jetë si më poshtë. Futni # heksadecimal ose oktal, ose 00 në guit: # = 0xf Dhjetor # = 15 # = 0100 Dhjetor # = 64 # = 00 Dhjetor # = 0.

Artikujt kryesorë të lidhur