Scanf C funkcijas apraksts
Scanf C funkcijas apraksts

Video: Scanf C funkcijas apraksts

Video: Scanf C funkcijas apraksts
Video: Thorium: An energy solution - THORIUM REMIX 2011 2024, Maijs
Anonim

Šajā rakstā funkcija scanf() ir aplūkota vispārīgā formā bez atsauces uz konkrētu standartu, tāpēc šeit ir iekļauti dati no jebkuriem C99, C11, C++11, C++14 standartiem. Iespējams, dažos standartos funkcija darbojas ar atšķirībām no rakstā sniegtā materiāla.

scanf C funkcija - apraksts

scanf() ir funkcija, kas atrodas stdio.h(C) un cstdio(C++) galvenes failos, ko sauc arī par formatētu programmas ievadi. Scanf nolasa rakstzīmes no standarta ievades straumes (stdin) un pārveido tās atbilstoši formātam, pēc tam ieraksta norādītajos mainīgajos. Formāts - nozīmē, ka pēc saņemšanas dati tiek pārvērsti noteiktā formā. Tādējādi Scanf C funkcija ir aprakstīta:

scanf("% formāts", &mainīgais1[, &mainīgais2, […]), kur mainīgie tiek nodoti kā adreses. Iemesls šādam mainīgo nodošanas veidam funkcijai ir acīmredzams: darba rezultātā tā atgriež vērtību, kas norāda uz kļūdu esamību, tāpēcvienīgais veids, kā mainīt mainīgo vērtības, ir adreses nodošana. Turklāt, pateicoties šai metodei, funkcija var apstrādāt jebkura veida datus.

Daži programmētāji tādas funkcijas kā scanf() vai printf() dēvē par procedūrām analoģijas ar citām valodām dēļ.

Skenēšana ļauj ievadīt visus pamata valodu veidus: char, int, float, string utt. String tipa mainīgo gadījumā nav jānorāda adreses zīme - "&", jo tipa virknes mainīgais ir masīvs, un tā nosaukums ir pirmā masīva elementa adrese datora atmiņā..

Izmantojot C programmā C++
Izmantojot C programmā C++

Datu ievades formāts vai vadības virkne

Sāciet, apskatot Scanf C funkcijas piemēru no aprakstā.


include int main() { int x; while (scanf("%d", &x)==1) printf("%d\n", x); atgriezties 0; //prasība Linux sistēmām }

Ievades formāts sastāv no šādiem četriem parametriem: %[width][modifiers] type. Šajā gadījumā zīme "%" un veids ir obligāti parametri. Tas ir, minimālais formāts izskatās šādi: “%s”, “%d” un tā tālāk.

Kopumā rakstzīmes, kas veido formāta virkni, ir sadalītas:

  • formāta specifikācijas - jebkas, kas sākas ar %;
  • atdalošās vai atstarpes rakstzīmes - tās ir atstarpes, tabulēšanas rakstzīmes (t), jaunā rindiņa (n);
  • rakstzīmes, kas nav atstarpes.

Funkcija var nebūt droša.

Izmantojiet scanf_s(), nevis scanf().

(ziņojums no Visual Studio)

Veidojiet vai formāta specifikācijas, vai konvertēšanas rakstzīmes, vai vadības rakstzīmes

binārais kods
binārais kods

Scanf C deklarācijā ir jāsatur vismaz formāta norādītājs, kas norādīts izteiksmju beigās, kas sākas ar "%". Tas norāda programmai, kāda veida dati ir jāsagaida, ievadot, parasti no tastatūras. Visu formātu specifikāciju saraksts zemāk esošajā tabulā.

Tips Nozīme
1 %c Programma gaida rakstzīmes ievadi. Rakstāmajam mainīgajam ir jābūt ar rakstzīmju tipu char.
2 %d Programma sagaida, ka tiks ievadīts vesela skaitļa decimālskaitlis. Mainīgajam ir jābūt tipa int.
3 %i

Programma sagaida, ka tiks ievadīts vesela skaitļa decimālskaitlis. Mainīgajam ir jābūt tipa int.

4 %e, %E Programma paredz ievadīt peldošā komata (komata) skaitli eksponenciālā formā. Mainīgajam ir jābūt tipa float.
5 %f Programma sagaida peldošā komata skaitli (komatu). Mainīgajam ir jābūt tipa float.
6 %g, %G Programma sagaida peldošā komata skaitli (komatu). Mainīgajam ir jābūt tipa float.
7 %a Programma sagaida peldošā komata skaitli (komatu). Mainīgajam ir jābūt tipa float.
8 %o Programma paredz oktālu skaitli. Mainīgajam ir jābūt tipa int.
9 %s Programma gaida, kad tiks ievadīta virkne. Virkne ir jebkuru rakstzīmju kopa līdz pirmajai atdalītāja rakstzīmei. Mainīgajam ir jābūt tipa string.
10 %x, %X Programma gaida heksadecimālo skaitli. Mainīgajam ir jābūt tipa int.
11 %p Mainīgais sagaida rādītāja ievadi. Mainīgajam ir jābūt rādītāja tipa.
12 %n Ieraksta mainīgajam veselu skaitli, kas vienāds ar rakstzīmju skaitu, ko līdz šim nolasījusi funkcija scanf.
13 %u Programma nolasa neparakstītu veselu skaitli. Mainīgā tipam ir jābūt veselam skaitlim bez paraksta.
14 %b Programma gaida bināru skaitli. Mainīgajam ir jābūt tipa int.
15 %

Skenēta rakstzīmju kopa. Programma gaida rakstzīmju ievadīšanu.no ierobežotā kopuma, kas norādīts kvadrātiekavās. scanf darbosies tik ilgi, kamēr ievades straumē būs rakstzīmes no norādītās kopas.

16 %% Parakstieties "%".

Rakstzīmes formāta virknē

C++ kods
C++ kods

Zvaigznes simbols ()

Zvaigznīte () ir karodziņš, kas norāda, ka piešķiršanas darbība ir jāizslēdz. Zvaigznīte tiek ievietota uzreiz aiz "%" zīmes. Piemēram,


scanf("%d%c%d", &x, &y); //ignorēt rakstzīmi starp diviem veseliem skaitļiem. scanf("%s%d%s", str, str2); //ignorēt veselu skaitli starp divām virknēm.

Tas ir, ja konsolē ievadīsiet rindu "45-20", programma rīkosies šādi:

  1. Mainīgajam "x" tiks piešķirta vērtība 45.
  2. Mainīgajam "y" tiks piešķirta vērtība 20.
  3. Un mīnusa zīme (defise) "-" tiks ignorēta, pateicoties "%c".

Platums (vai lauka platums)

Šis ir vesels skaitlis starp zīmi "%" un formāta norādītāju, kas norāda maksimālo rakstzīmju skaitu, kas jālasa pašreizējā lasīšanas darbībā.


scanf("%20s", str); //lasīt pirmās 20 rakstzīmes no ievades straumes

Ir dažas svarīgas lietas, kas jāpatur prātā:

  1. scanf tiks pārtraukta, ja tiks parādīta atdalīšanas rakstzīme, pat ja tajā nav skaitītas 20 rakstzīmes.
  2. Ja ir ievadītas vairāk nekā 20 rakstzīmes, tikai pirmās 20 rakstzīmes tiks ierakstītas str.

Modifikatoritips (vai precizitāte)

splash kods
splash kods

Tie ir īpaši karodziņi, kas maina ievadei paredzēto datu veidu. Karogs ir norādīts pa kreisi no tipa norādītāja:

  • L vai l (mazs L) Ja "l" tiek lietots ar specifikācijām d, i, o, u, x, karodziņš norāda programmai, ka ir gaidāma ilga int ievade. Izmantojot "l" ar e vai f norādītāju, karodziņš norāda programmai, ka tai ir jāsagaida dubultā vērtība. "L" lietošana norāda programmai, ka ir gaidāms garš dubultnieks. Lietojot "l" ar specifikācijām "c" un "s", programma norāda, ka ir sagaidāmas divu baitu rakstzīmes, piemēram, wchar_t. Piemēram, "%lc", "%ls", "%l[asd]".
  • h ir karodziņš, kas norāda īso veidu.
  • hh - norāda, ka mainīgais ir rādītājs uz parakstītas vai neparakstītas rakstzīmes vērtību. Karodziņu var izmantot ar specifikācijām d, i, o, u, x, n.
  • ll (divi mazi L) - norāda, ka mainīgais ir rādītājs uz vērtību, kuras tips ir ar zīmi long long int vai unsigned long long int. Karogs tiek izmantots ar specifikācijām: d, i, o, u, x, n.
  • j - norāda, ka mainīgais ir rādītājs uz intmax_t vai uintmax_t tipu no galvenes faila stdint.h. Izmanto ar specifikācijām: d, i, o, u, x, n.
  • z - norāda, ka mainīgais ir rādītājs uz size_t tipu, kura definīcija ir stddef.h. Izmanto ar specifikācijām: d, i, o, u, x, n.
  • t - norāda, ka mainīgais ir rādītājs uz ptrdiff_t tipu. Definīcija ieslēgtašis veids ir stddef.h. Izmanto ar specifikācijām: d, i, o, u, x, n.

Skaidrāk, attēlu ar modifikatoriem var attēlot kā tabulu. Šāds scanf C apraksts programmētājiem būs skaidrāks.

Tipu specifikācijas un modifikatori
Tipu specifikācijas un modifikatori

Citas rakstzīmes

Visas šajā formātā sastopamās rakstzīmes tiks izmestas. Tajā pašā laikā jāņem vērā, ka atstarpes vai atdalītāju rakstzīmju (jaunrindas, atstarpes, tabulēšanas) klātbūtne vadības virknē var izraisīt atšķirīgu funkcijas darbību. Vienā versijā scanf() tiks lasīts, nesaglabājot nevienu atdalītāju skaitu, līdz tiks sastapta cita rakstzīme, nevis atdalītājs, un citā versijā atstarpes (tikai tās) nespēlē lomu un izteiksme "%d + %d" ir līdzvērtīgs "% d+%d".

C++ koda piemērs
C++ koda piemērs

Piemēri

Apskatīsim dažus piemērus, lai palīdzētu jums domāt un labāk izprast, kā funkcija darbojas.


scanf("%3s", str); //ja konsolē ievadāt virkni "1d2s3d1;3", str scanf("%dminus%d", &x, &y) tiks ierakstīts tikai "1d2"; //mīnus rakstzīmes starp diviem cipariem tiks izmestas scanf("%5[0-9]", str); // rakstzīmes tiks ievadītas str, līdz būs 5 rakstzīmes un rakstzīmes ir cipari no 0 līdz 9. scanf("%lf", &d); //sagaidīt dubulto ievadi scanf("%hd", &x); //paredzamais tipa skaits short scanf("%hu", &y); //sagaidīt neparakstītu skaitli short scanf("lx", &z); //paredzamais tipa garums long int

NoTālāk sniegtajos piemēros parādīts, kā paredzamais skaitlis mainās, izmantojot dažādus simbolus.

scanf C - apraksts iesācējiem

Šī sadaļa noderēs iesācējiem. Bieži vien jums ir nepieciešams ne tik daudz pilnīgs scanf C apraksts, cik detalizēta informācija par funkcijas darbību.

  • Šī funkcija ir nedaudz novecojusi. Dažādu versiju bibliotēkās ir vairākas dažādas implementācijas. Piemēram, uzlabotā funkcija scanf S C, kuras aprakstu var atrast Microsoft vietnē.
  • Norādītāju skaitam formātā ir jāatbilst funkcijai nodoto argumentu skaitam.
  • Ievades straumes elementi ir jāatdala tikai ar atdalīšanas rakstzīmēm: atstarpe, tabulēšana, jauna rinda. Komats, semikols, punkts utt. - šīs rakstzīmes nav funkcijas scanf() atdalītāji.
  • Ja scanf tiek parādīta atdalīšanas rakstzīme, ievade tiks apturēta. Ja ir jālasa vairāk nekā viens mainīgais, Scanf pāries uz nākamā mainīgā lasīšanu.
  • Mazākā pretruna ievades datu formātā noved pie neparedzamiem programmas rezultātiem. Nu, ja programma vienkārši beidzas ar kļūdu. Taču bieži vien programma turpina darboties un dara to nepareizi.
  • scanf("%20s …", …); Ja ievades straume pārsniedz 20 rakstzīmes, scanf nolasīs pirmās 20 rakstzīmes un vai nu pārtrauks, vai pāries uz nākamā mainīgā lasīšanu, ja tāds ir norādīts. Šādā gadījumā nākamais zvans uz scanf turpinās nolasīt ievades straumi no vietas, kur tika pārtraukta iepriekšējā zvana scanf darbība. Ja lasot pirmos 20rakstzīmes, tiek sastapta norobežotāja rakstzīme, scanf pārtrauks vai turpinās nākamā mainīgā lasīšanu, pat ja tas nenolasīja 20 rakstzīmes pirmajam mainīgajam. Šādā gadījumā visas nelasītās rakstzīmes tiks pievienotas nākamajam mainīgajam.
  • Ja skenēto rakstzīmju kopa sākas ar "^", tad scanf nolasīs datus, līdz sastapsies ar norobežojošo rakstzīmi vai rakstzīmi no kopas. Piemēram, "%[^A-E1-5]" nolasīs datus no straumes, līdz tiks atrasta viena no angļu lielajiem burtiem no A līdz E vai kāds no cipariem no 1 līdz 5.
  • Funkcija scanf C, kā aprakstīts, atgriež skaitli, kas vienāds ar veiksmīgo mainīgo ierakstu skaitu. Ja scanf ieraksta 3 mainīgos, tad funkcijas veiksmes rezultāts atgriezīs skaitli 3. Ja scanf nevarēja ierakstīt nevienu mainīgo, tad rezultāts būs 0. Un, visbeidzot, ja scanf kāda iemesla dēļ nevarēja startēt vispār, rezultāts būs EOF.
  • Ja funkcija scanf() beidzās nepareizi. Piemēram, scanf("%d", &x) - tika gaidīts skaitlis, bet kā ievade tika saņemtas rakstzīmes. Nākamais scanf() izsaukums sāksies tajā ievades straumes punktā, kur beidzās iepriekšējais funkcijas izsaukums. Lai pārvarētu šo problēmu, ir jāatbrīvojas no problēmu rakstzīmēm. To var izdarīt, piemēram, izsaucot scanf("%s"). Tas nozīmē, ka funkcija nolasīs rakstzīmju virkni un izmetīs to. Šādā sarežģītajā veidā varat turpināt ievadīt nepieciešamos datus.
  • Dažās scanf() implementācijās "-" nav atļauts skenētajā rakstzīmju kopā.
  • Norādītājs "%c" nolasa katru rakstzīmi no straumes. Tas nozīmē, ka tas nolasa arī atdalīšanas rakstzīmi. Lai izlaistu norobežotāja rakstzīmi un turpinātu lasīt vajadzīgo rakstzīmi, varat izmantot "%1s".
  • Izmantojot "c" norādītāju, ir pieļaujams izmantot platumu "%10c", bet tad char tipa elementu masīvs ir jānodod kā mainīgais funkcijai scanf.
  • “%[a-z]” nozīmē “visi mazie angļu alfabēta burti”, un “%[z-a]” nozīmē tikai 3 rakstzīmes: “z”, “a”, “-”. Citiem vārdiem sakot, rakstzīme "-" nozīmē diapazonu tikai tad, ja tas ir starp divām rakstzīmēm, kas ir pareizā secībā. Ja "-" ir izteiksmes beigās, sākumā vai nepareizā rakstzīmju secībā abās to pusēs, tad tā ir tikai defise, nevis diapazons.
C++ kods
C++ kods

Secinājums

Tas noslēdz Scanf C aprakstu. Šī ir jauka parocīga funkcija darbam ar mazām programmām un procesuālās programmēšanas metodes izmantošanai. Tomēr galvenais trūkums ir neparedzamu kļūdu skaits, kas var rasties, izmantojot scanf. Tāpēc Scanf C aprakstu programmēšanas laikā vislabāk paturēt acu priekšā. Lielos profesionālos projektos tiek izmantotas iostreams, jo tām ir augstāka līmeņa iespējas, tās spēj labāk uztvert un apstrādāt kļūdas, kā arī strādāt ar ievērojamu informācijas apjomu. Jāatzīmē arī, ka scanf C apraksts krievu valodā ir pieejams daudzos tīkla avotos, kā arī tā piemērilietošana funkcijas vecuma dēļ. Tāpēc, ja nepieciešams, vienmēr varat atrast atbildi tematiskajos forumos.

Ieteicams: