Përshkrimi i funksionit Scanf C
Përshkrimi i funksionit Scanf C

Video: Përshkrimi i funksionit Scanf C

Video: Përshkrimi i funksionit Scanf C
Video: Учить английский: 4000 английских предложений для ежедневного использования в разговорах 2024, Prill
Anonim

Në këtë artikull, funksioni scanf() konsiderohet në një formë të përgjithshme pa iu referuar një standardi specifik, kështu që të dhënat nga çdo standard C99, C11, C++11, C++14 përfshihen këtu. Ndoshta, në disa standarde, funksioni funksionon me dallime nga materiali i paraqitur në artikull.

scanf funksion C - përshkrim

scanf() është një funksion i vendosur në skedarët e kokës stdio.h(C) dhe cstdio(C++), i njohur gjithashtu si hyrje e programit të formatuar. scanf lexon karaktere nga rrjedha standarde e hyrjes (stdin) dhe i konverton ato sipas formatit, pastaj i shkruan ato në variablat e specifikuar. Format - do të thotë që të dhënat konvertohen në një formë të caktuar pas marrjes. Kështu, funksioni scanf C përshkruhet:

scanf("%format", &variable1[, &variable2, […]), ku variablat kalohen si adresa. Arsyeja për këtë mënyrë të kalimit të variablave në një funksion është e qartë: si rezultat i punës, ai kthen një vlerë që tregon praninë e gabimeve, kështu qëmënyra e vetme për të ndryshuar vlerat e variablave është duke kaluar pranë adresës. Gjithashtu, falë kësaj metode, funksioni mund të përpunojë të dhëna të çdo lloji.

Disa programues i referohen funksioneve si scanf() ose printf() si procedura për shkak të analogjisë me gjuhë të tjera.

Scanf lejon futjen e të gjitha llojeve të gjuhëve bazë: char, int, float, string, etj. Në rastin e variablave të tipit string, nuk ka nevojë të specifikoni shenjën e adresës - "&", pasi ndryshorja e tipit string është një grup, dhe emri i tij është adresa e elementit të parë të grupit në kujtesën e kompjuterit..

Përdorimi i C në C++
Përdorimi i C në C++

Formati i futjes së të dhënave ose vargu i kontrollit

Filloni duke parë shembullin e funksionit scanf C nga përshkrimi.


include int main() { int x; ndërsa (scanf("%d", &x)==1) printf("%d\n", x); kthimi 0; //kërkesa për sistemet linux }

Formati i hyrjes përbëhet nga katër parametrat e mëposhtëm: lloji %[width][modifiers]. Në këtë rast, shenja "%" dhe lloji janë parametra të detyrueshëm. Kjo do të thotë, formati minimal duket kështu: "%s", "%d" dhe kështu me radhë.

Në përgjithësi, karakteret që përbëjnë vargun e formatit ndahen në:

  • specifikuesit e formatit - çdo gjë që fillon me %;
  • ndarja ose karakteret e hapësirës - ato janë hapësira, tab(t), rreshti i ri (n);
  • karaktere përveç hapësirës së bardhë.

Funksioni mund të mos jetë i sigurt.

Përdor scanf_s() në vend të scanf().

(mesazh nga Visual Studio)

Specifikuesit e llojit ose formatit, ose karakteret e konvertimit ose karakteret e kontrollit

kodi binar
kodi binar

Një deklaratë scanf C duhet të përmbajë të paktën një specifikues formati, i cili specifikohet në fund të shprehjeve që fillojnë me "%". Ai i tregon programit llojin e të dhënave që priten kur futen, zakonisht nga tastiera. Lista e të gjithë specifikuesve të formatit në tabelën e mëposhtme.

Lloji

Kuptimi

1 %c Programi është duke pritur për një futje karakteresh. Variabla që do të shkruhet duhet të jetë e tipit char.
2 %d Programi pret hyrjen e një numri dhjetor të llojit të numrit të plotë. Variabla duhet të jetë e tipit int.
3 %i Programi pret hyrjen e një numri dhjetor të llojit të numrit të plotë. Variabla duhet të jetë e tipit int.
4 %e, %E Programi pret të fusë një numër me pikë lundruese (presje) në formë eksponenciale. Variabla duhet të jetë e tipit float.
5 %f Programi pret një numër me pikë lundruese (presje). Variabla duhet të jetë e tipit float.
6 %g, %G Programi pret një numër me pikë lundruese (presje). Variabla duhet të jetë e tipit float.
7 %a Programi pret një numër me pikë lundruese (presje). Variabla duhet të jetë e tipit float.
8 %o Programi pret një numër oktal. Variabla duhet të jetë e tipit int.
9 %s Programi pret që të futet një varg. Një varg është një grup i çdo karakteri deri në karakterin e parë ndarës që haset. Variabla duhet të jetë e tipit string.
10 %x, %X Programi është duke pritur për një numër heksadecimal. Variabla duhet të jetë e tipit int.
11 %p Variable pret hyrjen e treguesit. Variabla duhet të jetë e llojit të treguesit.
12 %n

Shkruan në një ndryshore një vlerë të plotë të barabartë me numrin e karaktereve të lexuara deri më tani nga funksioni scanf.

13 %u Programi lexon një numër të plotë të panënshkruar. Lloji i ndryshores duhet të jetë numër i plotë i panënshkruar.
14 %b Programi është duke pritur për një numër binar. Variabla duhet të jetë e tipit int.
15 % Set i karaktereve të skanuara. Programi është duke pritur që personazhet të futen.nga grupi i kufizuar i specifikuar midis kllapave katrore. scanf do të funksionojë për sa kohë që ka karaktere nga grupi i specifikuar në rrjedhën hyrëse.
16 %% Shenja "%".

Karakteret në vargun e formatit

Kodi C++
Kodi C++

Simbol ylli ()

Ylli () është një flamur që tregon se operacioni i caktimit duhet të shtypet. Një yll vendoset menjëherë pas shenjës "%". Për shembull,


scanf("%d%c%d", &x, &y); //injoroje karakterin midis dy numrave të plotë. scanf("%s%d%s", str, str2); //injoroje numrin e plotë midis dy vargjeve.

Dmth, nëse futni rreshtin "45-20" në tastierë, programi do të bëjë si më poshtë:

  1. Ndryshores "x" do t'i caktohet vlera 45.
  2. Ndryshores "y" do t'i caktohet vlera 20.
  3. Dhe shenja minus (dash) "-" do të shpërfillet falë "%c".

Gjerësia (ose gjerësia e fushës)

Ky është një numër i plotë midis shenjës "%" dhe specifikuesit të formatit që specifikon numrin maksimal të karaktereve për t'u lexuar në operacionin aktual të leximit.


scanf("%20s", str); //lexoni 20 karakteret e para nga rryma hyrëse

Ka disa gjëra të rëndësishme që duhen mbajtur parasysh:

  1. scanf do të përfundojë nëse ndeshet me një karakter ndarës, edhe nëse nuk ka numëruar 20 karaktere.
  2. Nëse futen më shumë se 20 karaktere, vetëm 20 karakteret e para do të shkruhen në rr.

Modifikueslloji (ose saktësia)

kodi i spërkatjes
kodi i spërkatjes

Këta janë flamuj të veçantë që modifikojnë llojin e të dhënave që priten për hyrje. Flamuri është specifikuar në të majtë të specifikuesit të tipit:

  • L ose l (L e vogël) Kur "l" përdoret me specifikuesit d, i, o, u, x, flamuri i tregon programit se pritet input i gjatë. Kur përdorni "l" me specifikuesin e ose f, flamuri i tregon programit se duhet të presë një vlerë të dyfishtë. Përdorimi i "L" i tregon programit se pritet një dyshe e gjatë. Përdorimi i "l" me specifikuesit "c" dhe "s" i tregon programit se priten karaktere me dy bajtë si wchar_t. Për shembull, "%lc", "%ls", "%l[asd]".
  • h është një flamur që tregon llojin e shkurtër.
  • hh - tregon që ndryshorja është një tregues për një karakter të nënshkruar ose vlerë të panënshkruar. Flamuri mund të përdoret me specifikuesit d, i, o, u, x, n.
  • ll (dy L të vogla) - tregon se ndryshorja është një tregues për një vlerë të tipit të nënshkruar long long int ose unsigned long long int. Flamuri përdoret me specifikuesit: d, i, o, u, x, n.
  • j - tregon se ndryshorja është një tregues për llojin intmax_t ose uintmax_t nga skedari i kokës stdint.h. Përdoret me specifikuesit: d, i, o, u, x, n.
  • z - tregon se ndryshorja është një tregues për llojin size_t, përkufizimi i të cilit është në stddef.h. Përdoret me specifikuesit: d, i, o, u, x, n.
  • t - tregon se ndryshorja është një tregues për llojin ptrdiff_t. Përkufizimi nëky lloj është në stddef.h. Përdoret me specifikuesit: d, i, o, u, x, n.

Më qartë, fotografia me modifikues mund të përfaqësohet si një tabelë. Një përshkrim i tillë i scanf C për programuesit do të jetë më i qartë.

Lloji Specifikimi dhe Modifikues
Lloji Specifikimi dhe Modifikues

Personazhe të tjerë

Çdo karakter që haset në format do të hidhet poshtë. Në të njëjtën kohë, duhet të theksohet se prania e karaktereve të hapësirës së bardhë ose ndarës (line, hapësirë, skedë) në vargun e kontrollit mund të çojë në sjellje të ndryshme të funksionit. Në një version, scanf() do të lexojë pa ruajtur asnjë numër ndarësish derisa të ndeshet me një karakter tjetër përveç ndarësit, dhe në një version tjetër, hapësirat (vetëm ato) nuk luajnë një rol dhe shprehja "%d + %d" është ekuivalente me "% d+%d".

Shembull kodi C++
Shembull kodi C++

Shembuj

Le të shohim disa shembuj për t'ju ndihmuar të mendoni dhe të kuptoni më mirë se si funksionon funksioni.


scanf("%3s", str); //nëse futni vargun "1d2s3d1;3" në tastierë, vetëm "1d2" do të shkruhet në str scanf("%dminus%d", &x, &y); // karakteret minus ndërmjet dy numrave do të hiqen scanf("%5[0-9]", str); // karakteret do të futen në str derisa të ketë 5 karaktere dhe karakteret janë numra nga 0 në 9. scanf("%lf", &d); //prit scanf me hyrje të dyfishtë ("%hd", &x); //numri i pritshëm i tipit scanf i shkurtër ("%hu", &y); //prit numrin e panënshkruar scanf të shkurtër ("lx", &z); //numri i pritshëm i llojit të gjatë int

NgaShembujt më poshtë tregojnë se si ndryshon numri i pritur duke përdorur simbole të ndryshme.

scanf C - përshkrim për fillestarët

Ky seksion do të jetë i dobishëm për fillestarët. Shpesh ju duhet të keni në dorë një përshkrim të plotë të skanfit C sesa detajet se si funksionon funksioni.

  • Kjo veçori është disi e vjetëruar. Ekzistojnë disa implementime të ndryshme në biblioteka të versioneve të ndryshme. Për shembull, funksioni i përmirësuar i skanimit S C, një përshkrim i të cilit mund të gjendet në faqen e internetit të microsoft.
  • Numri i specifikuesve në format duhet të përputhet me numrin e argumenteve të kaluara në funksion.
  • Elementet e transmetimit të hyrjes duhet të ndahen vetëm me karaktere ndarëse: hapësirë, skedë, rresht i ri. Presje, pikëpresje, pikë, etj. - këto karaktere nuk janë ndarës për funksionin scanf().
  • Nëse scanf has një karakter ndarës, futja do të ndalet. Nëse ka më shumë se një variabël për të lexuar, atëherë scanf do të kalojë në leximin e ndryshores tjetër.
  • Mospërputhja më e vogël në formatin e të dhënave hyrëse çon në rezultate të paparashikueshme të programit. Epo, nëse programi thjesht përfundon me një gabim. Por shpesh programi vazhdon të funksionojë dhe e bën gabim.
  • scanf("%20s …", …); Nëse transmetimi i hyrjes i kalon 20 karaktere, atëherë scanf do të lexojë 20 karakteret e para dhe ose do të anulojë ose do të vazhdojë te leximi i variablit tjetër, nëse është specifikuar një. Në këtë rast, thirrja tjetër për skanim do të vazhdojë të lexojë rrjedhën hyrëse nga pika ku ndaloi puna e thirrjes së mëparshme për skanim. Nëse kur lexoni 20 të paratkaraktere, haset një karakter ndarës, scanf do të ndërpresë ose do të vazhdojë të lexojë variablin tjetër, edhe nëse nuk ka lexuar 20 karaktere për variablin e parë. Në këtë rast, të gjitha karakteret e palexuara do t'i bashkëngjiten variablit tjetër.
  • Nëse grupi i karaktereve të skanuara fillon me një "^", atëherë scanf do t'i lexojë të dhënat derisa të hasë një karakter ndarës ose një karakter nga grupi. Për shembull, "%[^A-E1-5]" do të lexojë të dhëna nga transmetimi derisa të ndeshet një nga karakteret e mëdha angleze nga A në E ose një nga numrat nga 1 në 5.
  • Funksioni scanf C, siç përshkruhet, kthen një numër të barabartë me numrin e suksesshëm të shkrimeve në variabla. Nëse scanf shkruan 3 variabla, atëherë rezultati i suksesit të funksionit do të kthejë numrin 3. Nëse scanf nuk mund të shkruajë asnjë variabël, atëherë rezultati do të jetë 0. Dhe, së fundi, nëse scanf nuk mund të fillojë fare për ndonjë arsye, rezultati do të jetë EOF.
  • Nëse funksioni scanf() ka përfunduar gabimisht. Për shembull, scanf("%d", &x) - pritej një numër, por karakteret u morën si hyrje. Thirrja tjetër scanf() do të fillojë në pikën në rrjedhën hyrëse ku mbaroi thirrja e mëparshme e funksionit. Për të kapërcyer këtë problem, është e nevojshme të heqësh qafe personazhet e problemit. Kjo mund të bëhet, për shembull, duke thirrur scanf("%s"). Kjo do të thotë, funksioni do të lexojë një varg karakteresh dhe do ta hedhë atë. Në këtë mënyrë të ndërlikuar, mund të vazhdoni të futni të dhënat e nevojshme.
  • Në disa implementime të scanf(), "-" nuk lejohet në grupin e karaktereve të skanuara.
  • Specifikuesi "%c" lexon çdo karakter nga transmetimi. Domethënë lexon edhe karakterin ndarës. Për të kapërcyer karakterin ndarës dhe për të vazhduar leximin e karakterit të dëshiruar, mund të përdorni "%1s".
  • Kur përdoret specifikuesi "c", lejohet të përdoret gjerësia "%10c", por më pas një grup elementësh të tipit char duhet t'i kalohet si variabël funksionit scanf.
  • "%[a-z]" do të thotë "të gjitha shkronjat e vogla të alfabetit anglez" dhe "%[z-a]" do të thotë vetëm 3 karaktere: "z", "a", "-". Me fjalë të tjera, karakteri "-" nënkupton një interval vetëm nëse është midis dy karaktereve që janë në rendin e duhur. Nëse "-" është në fund të një shprehjeje, në fillim ose në rendin e gabuar të karaktereve në të dyja anët e tyre, atëherë është thjesht një karakter vizë, jo një interval.
Kodi C++
Kodi C++

Përfundim

Kjo përfundon përshkrimin e skanimit C. Ky është një veçori e këndshme e dobishme për të punuar në programe të vogla dhe kur përdorni metodën e programimit procedural. Sidoqoftë, disavantazhi kryesor është numri i gabimeve të paparashikueshme që mund të ndodhin kur përdorni scanf. Prandaj, përshkrimi i skanimit C gjatë programimit mbahet më së miri para syve tuaj. Në projektet e mëdha profesionale, përdoren iostreams, për faktin se ato kanë aftësi të nivelit më të lartë, ata janë më të aftë të kapin dhe trajtojnë gabimet, si dhe të punojnë me sasi të konsiderueshme informacioni. Duhet gjithashtu të theksohet se përshkrimi i scanf C në Rusisht është i disponueshëm në shumë burime të rrjetit, si dhe shembuj të tijpërdorimi, për shkak të moshës së funksionit. Prandaj, nëse është e nevojshme, gjithmonë mund ta gjeni përgjigjen në forumet tematike.

Recommended: