2024 Outeur: Howard Calhoun | [email protected]. Laas verander: 2024-01-17 18:38
In hierdie artikel word die scanf()-funksie in 'n algemene vorm beskou sonder verwysing na 'n spesifieke standaard, dus is data van enige C99, C11, C++11, C++14 standaarde hier ingesluit. Miskien, in sommige standaarde, werk die funksie met verskille van die materiaal wat in die artikel aangebied word.
scanf C-funksie - beskrywing
scanf() is 'n funksie geleë in die stdio.h(C) en cstdio(C++) koplêers, ook bekend as geformateerde programinvoer. scanf lees karakters uit die standaard invoerstroom (stdin) en sit dit om volgens die formaat, en skryf dit dan na die gespesifiseerde veranderlikes. Formaat - beteken dat die data by ontvangs na 'n sekere vorm omgeskakel word. Dus word die scanf C-funksie beskryf:
scanf("%formaat", &veranderlike1[, &veranderlike2, […]), waar veranderlikes as adresse deurgegee word. Die rede vir hierdie manier om veranderlikes na 'n funksie oor te dra is voor die hand liggend: as gevolg van werk gee dit 'n waarde terug wat die teenwoordigheid van foute aandui, dusdie enigste manier om die waardes van veranderlikes te verander, is deur adres deur te gee. Danksy hierdie metode kan die funksie ook data van enige tipe verwerk.
Sommige programmeerders verwys na funksies soos scanf() of printf() as prosedures vanweë die analogie met ander tale.
Scanf laat invoer toe van alle basiese ta altipes: char, int, float, string, ens. In die geval van veranderlikes van tipe string, is dit nie nodig om die adresteken - "&" te spesifiseer nie, aangesien die veranderlike van tipe string 'n skikking is, en sy naam is die adres van die eerste element van die skikking in die rekenaar se geheue.
Data-invoerformaat of beheerstring
Begin deur na die scanf C-funksievoorbeeld van die beskrywing te kyk.
include int main() { int x; while (scanf("%d", &x)==1) printf("%d\n", x); gee terug 0; //vereiste vir linux-stelsels }
Die invoerformaat bestaan uit die volgende vier parameters: %[width][modifiers] tipe. In hierdie geval is die "%"-teken en die tipe verpligte parameters. Dit wil sê, die minimum formaat lyk soos volg: “%s”, “%d” ensovoorts.
Oor die algemeen word die karakters waaruit die formaatstring bestaan, verdeel in:
- formaat-spesifiseerders - enigiets wat begin met %;
- skei- of spasiekarakters - hulle is spasie, tab(t), nuwelyn (n);
- karakters anders as witspasie.
Funksie is dalk nie veilig nie.
Gebruik scanf_s() in plaas van scanf().
(boodskap van Visual Studio)
Tip, of formaat spesifiseerders, of omskakeling karakters, of kontrole karakters
'n Scanf C-verklaring moet ten minste 'n formaatspesifiseerder bevat, wat gespesifiseer word aan die einde van uitdrukkings wat met "%" begin. Dit vertel die program die tipe data om te verwag wanneer dit ingevoer word, gewoonlik vanaf die sleutelbord. Lys van alle formaatspesifiseerders in die tabel hieronder.
Typ |
Betekenis |
|
1 | %c | Die program wag vir 'n karakterinvoer. Die veranderlike wat geskryf moet word moet van die karaktertipe char wees. |
2 | %d | Die program verwag invoer van 'n desimale getal van heelget altipe. Die veranderlike moet van tipe int wees. |
3 | %i | Die program verwag invoer van 'n desimale getal van heelget altipe. Die veranderlike moet van tipe int wees. |
4 | %e, %E | Die program verwag om 'n drywende punt (komma) getal in eksponensiële vorm in te voer. Die veranderlike moet van die tipe float wees. |
5 | %f | Die program verwag 'n drywende punt-nommer (komma). Die veranderlike moet van die tipe float wees. |
6 | %g, %G | Die program verwag 'n drywende punt-nommer (komma). Die veranderlike moet van die tipe float wees. |
7 | %a | Die program verwag 'n drywende punt-nommer (komma). Die veranderlike moet van die tipe float wees. |
8 | %o | Die program verwag 'n oktale getal. Die veranderlike moet van tipe int wees. |
9 | %s | Die program wag vir 'n string om in te voer. 'n String is 'n stel van enige karakters tot by die eerste skeidingskarakter wat teëgekom word. Die veranderlike moet van tipe string wees. |
10 | %x, %X | Die program wag vir 'n heksadesimale getal. Die veranderlike moet van tipe int wees. |
11 | %p | Veranderlike verwag wyserinvoer. Die veranderlike moet van wysertipe wees. |
12 | %n |
Skryf na 'n veranderlike 'n heelgetalwaarde gelyk aan die aantal karakters wat tot dusver deur die scanf-funksie gelees is. |
13 | %u | Die program lees 'n ongetekende heelgetal. Die veranderlike tipe moet ongetekende heelgetal wees. |
14 | %b | Die program wag vir 'n binêre nommer. Die veranderlike moet van tipe int wees. |
15 | % | Geskandeerde karakterstel. Die program wag vir karakters om in te voer.van die beperkte swembad gespesifiseer tussen vierkantige hakies. scanf sal werk solank daar karakters van die gespesifiseerde stel op die invoerstroom is. |
16 | %% | Teken "%". |
Karakters in die formaatstring
Stersimbool ()
Die asterisk () is 'n vlag wat aandui dat die opdragbewerking onderdruk moet word. 'n Sterretjie word onmiddellik na die "%"-teken geplaas. Byvoorbeeld,
scanf("%d%c%d", &x, &y); //ignoreer karakter tussen twee heelgetalle. scanf("%s%d%s", str, str2); //ignoreer heelgetal tussen twee stringe.
Dit wil sê, as jy die reël "45-20" in die konsole invoer, sal die program die volgende doen:
- Veranderlike "x" sal die waarde 45 toegeken word.
- Veranderlike "y" sal die waarde 20 toegeken word.
- En die minusteken (streep) "-" sal geïgnoreer word danksy "%c".
Width (of veldwydte)
Dit is 'n heelgetal tussen die "%"-teken en die formaat-spesifiseerder wat die maksimum aantal karakters spesifiseer om te lees in die huidige leesbewerking.
scanf("%20s", str); //lees die eerste 20 karakters uit die invoerstroom
Daar is 'n paar belangrike dinge om in gedagte te hou:
- scanf sal eindig as dit 'n skeidingskarakter teëkom, selfs al het dit nie 20 karakters getel nie.
- As meer as 20 karakters ingevoer word, sal slegs die eerste 20 karakters na str geskryf word.
Wysigerstipe (of akkuraatheid)
Hierdie is spesiale vlae wat die tipe data wat vir invoer verwag word, verander. Die vlag word aan die linkerkant van die tipe spesifiseerder gespesifiseer:
- L of l (klein L) Wanneer "l" met die spesifikasies d, i, o, u, x gebruik word, vertel die vlag vir die program dat lang int-invoer verwag word. Wanneer "l" met die e- of f-spesifiseerder gebruik word, sê die vlag vir die program dat dit 'n dubbele waarde moet verwag. Die gebruik van "L" vertel die program dat 'n lang dubbel verwag word. Die gebruik van "l" met die "c" en "s" spesifikasies vertel die program dat twee-grepe karakters soos wchar_t verwag word. Byvoorbeeld, "%lc", "%ls", "%l[asd]".
- h is 'n vlag wat die kort tipe aandui.
- hh - dui aan dat die veranderlike 'n wyser is na 'n getekende char of ongetekende char waarde. Die vlag kan gebruik word met die spesifikasies d, i, o, u, x, n.
- ll (twee klein L'e) - dui aan dat die veranderlike 'n wyser is na 'n waarde van tipe geteken long long int of unsigned long long int. Die vlag word gebruik met spesifikasies: d, i, o, u, x, n.
- j - dui aan dat die veranderlike 'n wyser is na die intmax_t- of uintmax_t-tipe vanaf die stdint.h-koplêer. Gebruik met spesifikasies: d, i, o, u, x, n.
- z - dui aan dat die veranderlike 'n wyser is na die size_t-tipe, waarvan die definisie in stddef.h is. Gebruik met spesifikasies: d, i, o, u, x, n.
- t - dui aan dat die veranderlike 'n wyser na die ptrdiff_t-tipe is. Definisie ophierdie tipe is in stddef.h. Gebruik met spesifikasies: d, i, o, u, x, n.
Duideliker, die prentjie met wysigers kan as 'n tabel voorgestel word. So 'n beskrywing van scanf C vir programmeerders sal duideliker wees.
Ander karakters
Enige karakters wat in die formaat teëgekom word, sal weggegooi word. Terselfdertyd moet daarop gelet word dat die teenwoordigheid van witspasie of skei karakters (nuwelyn, spasie, oortjie) in die beheerstring kan lei tot verskillende gedrag van die funksie. In een weergawe sal scanf() lees sonder om enige aantal skeiers te stoor totdat dit 'n ander karakter as die skeier teëkom, en in 'n ander weergawe speel spasies (net hulle) nie 'n rol nie en die uitdrukking "%d + %d" is gelykstaande aan "% d+%d".
Voorbeelde
Kom ons kyk na 'n paar voorbeelde om jou te help dink en beter te verstaan hoe die funksie werk.
scanf("%3s", str); //as jy die string "1d2s3d1;3" in die konsole invoer, sal slegs "1d2" geskryf word na str scanf("%dminus%d", &x, &y); //minus karakters tussen twee getalle sal weggegooi word scanf("%5[0-9]", str); // karakters sal in str ingevoer word totdat daar 5 karakters is en die karakters is nommers van 0 tot 9. scanf("%lf", &d); //verwag dubbele invoer scanf("%hd", &x); //verwagte aantal tipe kort scanf("%hu", &y); //verwag ongetekende getal kort scanf("lx", &z); //verwagte aantal tipe lang int
VanDie voorbeelde hieronder wys hoe die verwagte getal verander deur verskillende simbole te gebruik.
scanf C - beskrywing vir beginners
Hierdie afdeling sal nuttig wees vir beginners. Dikwels moet jy nie soseer 'n volledige beskrywing van scanf C byderhand hê nie as die besonderhede van hoe die funksie werk.
- Hierdie kenmerk is ietwat verouderd. Daar is verskeie verskillende implementerings in biblioteke van verskillende weergawes. Byvoorbeeld, die verbeterde scanf S C-funksie, waarvan 'n beskrywing op die Microsoft-webwerf gevind kan word.
- Die aantal spesifiseerders in die formaat moet ooreenstem met die aantal argumente wat na die funksie gestuur is.
- Invoerstroomelemente moet slegs geskei word deur skeidingskarakters: spasie, tab, nuwe reël. Komma, kommapunt, punt, ens. - hierdie karakters is nie skeiers vir die scanf()-funksie nie.
- As scanf 'n skeidingskarakter teëkom, sal invoer gestop word. As daar meer as een veranderlike is om te lees, sal scanf voortgaan om die volgende veranderlike te lees.
- Die geringste inkonsekwentheid in die invoerdataformaat lei tot onvoorspelbare resultate van die program. Wel, as die program net eindig met 'n fout. Maar dikwels bly die program werk en doen dit verkeerd.
- scanf("%20s …", …); As die invoerstroom 20 karakters oorskry, sal scanf die eerste 20 karakters lees en óf afbreek óf voortgaan om die volgende veranderlike te lees, indien een gespesifiseer is. In hierdie geval sal die volgende oproep om te skandeer voortgaan om die invoerstroom te lees vanaf die punt waar die werk van die vorige oproep om te skandeer gestop het. As jy die eerste 20 leeskarakters, 'n skeidingskarakter word teëgekom, scanf sal die volgende veranderlike staak of voortgaan om die volgende veranderlike te lees, selfs al het dit nie 20 karakters vir die eerste veranderlike gelees nie. In hierdie geval sal alle ongeleesde karakters aan die volgende veranderlike geheg word.
- As die stel geskandeerde karakters met 'n "^" begin, dan sal scanf die data lees totdat dit 'n skeidingskarakter of 'n karakter uit die stel teëkom. Byvoorbeeld, "%[^A-E1-5]" sal data uit die stroom lees totdat een van die hoofletters Engelse karakters van A tot E of een van die nommers van 1 tot 5 teëgekom word.
- Die scanf C-funksie, soos beskryf, gee 'n getal terug wat gelyk is aan die suksesvolle aantal skryfwerk aan veranderlikes. As scanf 3 veranderlikes skryf, dan sal die suksesresultaat van die funksie die getal 3 terugstuur. As scanf geen veranderlikes kon skryf nie, dan sal die resultaat 0 wees. En, ten slotte, as scanf om een of ander rede glad nie kon begin nie, die resultaat sal EOF. wees
- As die scanf()-funksie verkeerd geëindig het. Byvoorbeeld, scanf("%d", &x) - 'n nommer is verwag, maar karakters is as invoer ontvang. Die volgende scanf()-oproep sal begin by die punt in die invoerstroom waar die vorige funksie-oproep geëindig het. Om hierdie probleem te oorkom, is dit nodig om van die probleemkarakters ontslae te raak. Dit kan byvoorbeeld gedoen word deur scanf("%s") te roep. Dit wil sê, die funksie sal 'n string karakters lees en dit weggooi. Op hierdie moeilike manier kan jy voortgaan om die nodige data in te voer.
- In sommige implementerings van scanf(), word "-" nie in die geskandeerde karakterstel toegelaat nie.
- Die "%c"-spesifiseerder lees elke karakter uit die stroom. Dit wil sê, dit lees ook die skeidingskarakter. Om die skeidingsteken oor te slaan en voort te gaan om die verlangde karakter te lees, kan jy "%1s". gebruik
- Wanneer die "c"-spesifiseerder gebruik word, is dit toelaatbaar om die breedte "%10c" te gebruik, maar dan moet 'n verskeidenheid elemente van tipe char as 'n veranderlike na die scanf-funksie deurgegee word.
- "%[a-z]" beteken "alle kleinletters van die Engelse alfabet", en "%[z-a]" beteken net 3 karakters: 'z', 'a', '-'. Met ander woorde, die "-" karakter beteken slegs 'n reeks as dit tussen twee karakters is wat in die korrekte volgorde is. As "-" aan die einde van 'n uitdrukking, aan die begin, of in die verkeerde volgorde van karakters aan weerskante van hulle is, dan is dit net 'n koppelteken, nie 'n reeks nie.
Gevolgtrekking
Dit sluit die beskrywing van scanf C af. Dit is 'n lekker handige kenmerk om in klein programme te werk en wanneer die prosedurele programmeringsmetode gebruik word. Die grootste nadeel is egter die aantal onvoorspelbare foute wat kan voorkom wanneer scanf gebruik word. Daarom word die beskrywing van scanf C wanneer jy programmering die beste voor jou oë gehou. In groot professionele projekte word iostreams gebruik, as gevolg van die feit dat hulle hoërvlakvermoëns het, hulle beter in staat is om foute op te vang en te hanteer, en ook met aansienlike hoeveelhede inligting werk. Daar moet ook op gelet word dat die beskrywing van scanf C in Russies beskikbaar is op baie netwerkbronne, sowel as voorbeelde daarvangebruik, as gevolg van die ouderdom van die funksie. Daarom, indien nodig, kan jy altyd die antwoord op die tematiese forums vind.