Scanf C funkcijos aprašymas
Scanf C funkcijos aprašymas

Video: Scanf C funkcijos aprašymas

Video: Scanf C funkcijos aprašymas
Video: High Density 2022 2024, Lapkritis
Anonim

Šiame straipsnyje funkcija scanf() nagrinėjama bendra forma, nenurodant konkretaus standarto, todėl čia pateikiami bet kurių C99, C11, C++11, C++14 standartų duomenys. Galbūt kai kuriuose standartuose funkcija veikia skirtingai nuo straipsnyje pateiktos medžiagos.

scanf C funkcija – aprašymas

scanf() yra funkcija, esanti stdio.h(C) ir cstdio(C++) antraštės failuose, taip pat žinoma kaip suformatuota programos įvestis. Scanf nuskaito simbolius iš standartinio įvesties srauto (stdin) ir konvertuoja juos pagal formatą, tada įrašo į nurodytus kintamuosius. Formatas – reiškia, kad gavus duomenis konvertuojami į tam tikrą formą. Taigi, Scanf C funkcija aprašyta:

scanf("%format", &kintamasis1[, &kintamasis2, […]), kur kintamieji perduodami kaip adresai. Šio kintamųjų perdavimo funkcijai būdo priežastis yra akivaizdi: dėl darbo ji grąžina reikšmę, rodančią klaidų buvimą, todėlvienintelis būdas pakeisti kintamųjų reikšmes yra perduodant adresą. Be to, dėl šio metodo funkcija gali apdoroti bet kokio tipo duomenis.

Kai kurie programuotojai tokias funkcijas kaip scanf() arba printf() vadina procedūromis dėl analogijos su kitomis kalbomis.

Scanf leidžia įvesti visų pagrindinių kalbų tipus: char, int, float, string ir kt. Jei kintamieji yra tipo eilutės, adreso ženklo - "&" nurodyti nereikia, nes tipo eilutės kintamasis yra masyvas, o jo pavadinimas yra pirmojo masyvo elemento adresas kompiuterio atmintyje..

C naudojimas C++
C naudojimas C++

Duomenų įvedimo formatas arba valdymo eilutė

Pradėkite žiūrėdami į Scanf C funkcijos pavyzdį iš aprašymo.


include int main() { int x; while (scanf("%d", &x)==1) printf("%d\n", x); grąžinti 0; //reikalavimas linux sistemoms }

Įvesties formatą sudaro šie keturi parametrai: %[width][modifiers] tipas. Šiuo atveju „%“ženklas ir tipas yra privalomi parametrai. Tai reiškia, kad minimalus formatas atrodo taip: „%s“, „%d“ir pan.

Apskritai simboliai, sudarantys formato eilutę, skirstomi į:

  • formato specifikacijos – viskas, kas prasideda %;
  • atskiriantys arba tarpo simboliai – jie yra tarpas, tabuliatorius (t), nauja eilutė (n);
  • simboliai, išskyrus tarpą.

Funkcija gali būti nesaugi.

Naudokite scanf_s() vietoj scanf().

(pranešimas iš Visual Studio)

Tipo arba formato specifikacijos, arba konvertavimo simboliai, arba valdymo simboliai

dvejetainis kodas
dvejetainis kodas

Scanf C deklaracijoje turi būti bent formato specifikatorius, kuris nurodomas išraiškų, prasidedančių raide „%“, pabaigoje. Jis nurodo programai, kokio tipo duomenis reikia tikėtis įvedant, dažniausiai iš klaviatūros. Visų formatų specifikacijų sąrašas toliau esančioje lentelėje.

Tipas Reikšmė
1 %c Programa laukia simbolio įvesties. Rašomas kintamasis turi būti simbolio tipo char.
2 %d Programa tikisi įvesti dešimtainį sveikųjų skaičių tipo skaičių. Kintamasis turi būti int.
3 %i

Programa tikisi įvesti dešimtainį sveikųjų skaičių tipo skaičių. Kintamasis turi būti int.

4 %e, %E Programa tikisi įvesti slankiojo kablelio (kablelio) skaičių eksponentine forma. Kintamasis turi būti float tipo.
5 %f Programa tikisi slankaus kablelio skaičiaus (kablelio). Kintamasis turi būti float tipo.
6 %g, %G Programa tikisi slankaus kablelio skaičiaus (kablelio). Kintamasis turi būti float tipo.
7 %a Programa tikisi slankaus kablelio skaičiaus (kablelio). Kintamasis turi būti float tipo.
8 %o Programa tikisi aštuntainio skaičiaus. Kintamasis turi būti int.
9 %s Programa laukia, kol bus įvesta eilutė. Eilutė yra bet kokių simbolių rinkinys iki pirmojo skiriamojo simbolio. Kintamasis turi būti eilutės tipo.
10 %x, %X Programa laukia šešioliktainio skaičiaus. Kintamasis turi būti int.
11 %p Kintamasis tikisi žymeklio įvesties. Kintamasis turi būti rodyklės tipo.
12 %n Į kintamąjį įrašo sveikojo skaičiaus reikšmę, lygią iki šiol funkcijos scanf nuskaitytų simbolių skaičiui.
13 %u Programa nuskaito sveikąjį skaičių be ženklo. Kintamojo tipas turi būti be ženklų sveikasis skaičius.
14 %b Programa laukia dvejetainio skaičiaus. Kintamasis turi būti int.
15 %

Nuskaitytas simbolių rinkinys. Programa laukia, kol bus įvesti simboliai.iš riboto telkinio, nurodyto laužtiniuose skliaustuose. scanf veiks tol, kol įvesties sraute bus simbolių iš nurodyto rinkinio.

16 %% Pasirašykite „%“.

Simboliai formato eilutėje

C++ kodas
C++ kodas

Žvaigždės simbolis ()

Žvaigždutė () yra vėliavėlė, nurodanti, kad priskyrimo operacija turi būti nuslopinta. Iš karto po „%“ženklo dedama žvaigždutė. Pavyzdžiui,


scanf("%d%c%d", &x, &y); //nepaisyti simbolio tarp dviejų sveikųjų skaičių. scanf("%s%d%s", str, str2); //nepaisyti sveikojo skaičiaus tarp dviejų eilučių.

Tai yra, jei konsolėje įvesite eilutę „45-20“, programa atliks šiuos veiksmus:

  1. Kintamajam "x" bus priskirta reikšmė 45.
  2. Kintamajam "y" bus priskirta reikšmė 20.
  3. Ir minuso ženklas (brūkšnelis) „-“bus ignoruojamas dėl „%c“.

Plotis (arba lauko plotis)

Tai yra sveikasis skaičius tarp „%“ženklo ir formato specifikatoriaus, nurodančio didžiausią simbolių skaičių, kurį reikia nuskaityti atliekant dabartinę skaitymo operaciją.


scanf("%20s", str); //perskaitykite pirmuosius 20 simbolių iš įvesties srauto

Yra keletas svarbių dalykų, kuriuos reikia atsiminti:

  1. scanf baigsis, jei aptiks skiriamąjį ženklą, net jei jame nėra 20 simbolių.
  2. Jei įvedama daugiau nei 20 simbolių, tik pirmieji 20 simbolių bus įrašyti į str.

Modifikatoriaitipas (arba tikslumas)

purslų kodas
purslų kodas

Tai yra specialios vėliavėlės, modifikuojančios laukiamų įvesties duomenų tipą. Vėliava nurodoma tipo specifikatoriaus kairėje:

  • L arba l (mažas L) Kai "l" naudojamas su specifikacijomis d, i, o, u, x, vėliavėlė nurodo programai, kad laukiama ilgo int įvesties. Naudojant "l" su e arba f specifikacija, vėliavėlė nurodo programai, kad ji turėtų tikėtis dvigubos reikšmės. „L“naudojimas nurodo programai, kad laukiamas ilgas dublis. „l“naudojimas su „c“ir „s“specifikacijomis nurodo programai, kad tikimasi dviejų baitų simbolių, tokių kaip wchar_t. Pavyzdžiui, „%lc“, „%ls“, „%l[asd]“.
  • h yra vėliavėlė, nurodanti trumpąjį tipą.
  • hh – rodo, kad kintamasis yra žymeklis į pasirašytą arba nepažymėtą simbolio reikšmę. Vėliava gali būti naudojama su specifikacijomis d, i, o, u, x, n.
  • ll (du maži L) – nurodo, kad kintamasis yra žymeklis, kurio tipas yra signed long long int arba unsigned long long int. Vėliava naudojama su specifikacijomis: d, i, o, u, x, n.
  • j – nurodo, kad kintamasis yra intmax_t arba uintmax_t tipo rodyklė iš stdint.h antraštės failo. Naudojama su specifikacijomis: d, i, o, u, x, n.
  • z – rodo, kad kintamasis yra rodyklė į size_t tipą, kurio apibrėžimas yra stddef.h. Naudojama su specifikacijomis: d, i, o, u, x, n.
  • t – rodo, kad kintamasis yra ptrdiff_t tipo rodyklė. Apibrėžimas įjungtasšis tipas yra stddef.h. Naudojama su specifikacijomis: d, i, o, u, x, n.

Aiškiau, paveikslėlį su modifikatoriais galima pavaizduoti kaip lentelę. Toks scanf C aprašymas programuotojams bus aiškesnis.

Tipo specifikacijos ir modifikatoriai
Tipo specifikacijos ir modifikatoriai

Kiti simboliai

Bus atmesti visi šio formato simboliai. Tuo pačiu metu reikia pažymėti, kad tarpo ar skyriklio simbolių (naujos eilutės, tarpo, tabuliavimo) buvimas valdymo eilutėje gali lemti skirtingą funkcijos elgesį. Vienoje versijoje scanf() skaitys neišsaugodamas nei vieno skyriklio skaičiaus, kol nesusidurs su kitu simboliu nei skyriklis, o kitoje versijoje tarpai (tik jie) nevaidina vaidmens ir išraiška "%d + %d" yra lygus „% d+%d“.

C++ kodo pavyzdys
C++ kodo pavyzdys

Pavyzdžiai

Pažvelkime į kelis pavyzdžius, kurie padės susimąstyti ir geriau suprasti, kaip veikia funkcija.


scanf("%3s", str); //jei konsolėje įvesite eilutę "1d2s3d1;3", str scanf("%dminus%d", &x, &y) bus įrašyta tik "1d2"; //Minus simboliai tarp dviejų skaičių bus atmesti scanf("%5[0-9]", str); // simboliai bus įvedami į str, kol bus 5 simboliai, o simboliai bus skaičiai nuo 0 iki 9. scanf("%lf", &d); //tikėtis dvigubos įvesties scanf("%hd", &x); //numatomas tipo skaičius short scanf("%hu", &y); //tikėtis nepasirašyto skaičiaus short scanf("lx", &z); //numatomas tipo long int skaičius

NuoToliau pateikti pavyzdžiai parodo, kaip numatomas skaičius keičiasi naudojant skirtingus simbolius.

scanf C – aprašymas pradedantiesiems

Šis skyrius bus naudingas pradedantiesiems. Dažnai po ranka reikia turėti ne tiek išsamų scanf C aprašymą, kiek išsamią informaciją apie tai, kaip funkcija veikia.

  • Ši funkcija yra šiek tiek pasenusi. Yra keletas skirtingų diegimų skirtingų versijų bibliotekose. Pavyzdžiui, patobulinta funkcija scanf S C, kurios aprašymą galima rasti „Microsoft“svetainėje.
  • Formato specifikacijų skaičius turi atitikti funkcijai perduotų argumentų skaičių.
  • Įvesties srauto elementai turi būti atskirti tik skiriamaisiais ženklais: tarpas, tabuliacija, nauja eilutė. Kablelis, kabliataškis, taškas ir kt. – šie simboliai nėra funkcijos scanf() skyrikliai.
  • Jei scanf aptinka skiriamąjį simbolį, įvestis bus sustabdyta. Jei reikia skaityti daugiau nei vieną kintamąjį, tada scanf pereis prie kito kintamojo skaitymo.
  • Mažiausias įvesties duomenų formato neatitikimas lemia nenuspėjamus programos rezultatus. Na, jei programa tiesiog baigiasi klaida. Tačiau dažnai programa toliau veikia ir daro tai neteisingai.
  • scanf("%20s …", …); Jei įvesties srautas viršija 20 simbolių, Scanf nuskaitys pirmuosius 20 simbolių ir nutrauks arba pereis prie kito kintamojo skaitymo, jei jis nurodytas. Tokiu atveju kitas skambutis į scanf toliau skaitys įvesties srautą nuo taško, kur sustojo ankstesnio skambučio scanf darbas. Jei skaitant pirmuosius 20simbolių, aptinkamas skyriklio simbolis, scanf nutrauks arba toliau skaitys kitą kintamąjį, net jei jis nenuskaitė 20 pirmojo kintamojo simbolių. Tokiu atveju visi neskaityti simboliai bus pridėti prie kito kintamojo.
  • Jei nuskaitytų simbolių rinkinys prasideda raide „^“, „scanf“skaitys duomenis, kol susidurs su skiriamuoju ženklu arba simboliu iš rinkinio. Pavyzdžiui, „%[^A-E1-5]“skaitys duomenis iš srauto, kol bus aptiktas vienas iš didžiųjų anglų simbolių nuo A iki E arba vienas iš skaičių nuo 1 iki 5.
  • Funkcija scanf C, kaip aprašyta, grąžina skaičių, lygų sėkmingam kintamųjų įrašų skaičiui. Jei scanf įrašo 3 kintamuosius, tada funkcijos sėkmės rezultatas grąžins skaičių 3. Jei scanf negalėjo įrašyti nė vieno kintamojo, rezultatas bus 0. Ir galiausiai, jei scanf dėl kokių nors priežasčių iš viso nepavyko paleisti, rezultatas bus EOF.
  • Jei funkcija scanf() pasibaigė neteisingai. Pavyzdžiui, scanf("%d", &x) – tikėtasi skaičiaus, bet simboliai buvo gauti kaip įvestis. Kitas scanf() skambutis prasidės įvesties srauto taške, kur baigėsi ankstesnis funkcijos iškvietimas. Norint įveikti šią problemą, būtina atsikratyti probleminių simbolių. Tai galima padaryti, pavyzdžiui, iškviečiant scanf("%s"). Tai reiškia, kad funkcija perskaitys simbolių eilutę ir išmes ją. Šiuo sudėtingu būdu galite toliau įvesti reikiamus duomenis.
  • Kai kuriuose scanf() diegimuose „-“neleidžiamas nuskaitytame simbolių rinkinyje.
  • „%c“specifikacija nuskaito kiekvieną srauto simbolį. Tai yra, jis taip pat skaito skyriklio simbolį. Jei norite praleisti skiriamąjį simbolį ir toliau skaityti norimą simbolį, galite naudoti „%1s“.
  • Naudojant „c“specifikaciją, leidžiama naudoti plotį „%10c“, tačiau tada char tipo elementų masyvas turi būti perduotas kaip kintamasis funkcijai scanf.
  • „%[a-z]“reiškia „visos mažos anglų abėcėlės raidės“, o „%[z-a]“reiškia tik 3 simbolius: „z“, „a“, „-“. Kitaip tariant, simbolis „-“reiškia diapazoną tik tuo atveju, jei jis yra tarp dviejų simbolių, kurie yra teisinga tvarka. Jei "-" yra išraiškos pabaigoje, pradžioje arba neteisinga simbolių tvarka abiejose jų pusėse, tai yra tik brūkšnelis, o ne diapazonas.
C++ kodas
C++ kodas

Išvada

Baigiamas scanf C aprašymas. Tai puiki, patogi funkcija dirbant su mažomis programomis ir naudojant procedūrinio programavimo metodą. Tačiau pagrindinis trūkumas yra nenuspėjamų klaidų, kurios gali atsirasti naudojant scanf, skaičius. Todėl skanf C aprašymą programuojant geriausia laikyti prieš akis. Dideliuose profesionaliuose projektuose iostreams naudojami dėl to, kad turi aukštesnio lygio galimybes, geriau sugeba pagauti ir valdyti klaidas, taip pat dirbti su dideliu informacijos kiekiu. Taip pat reikėtų pažymėti, kad „scanf C“aprašymas rusų kalba yra prieinamas daugelyje tinklo š altinių, taip pat jo pavyzdžiai.naudoti dėl funkcijos amžiaus. Todėl, jei reikia, visada galite rasti atsakymą teminiuose forumuose.

Rekomenduojamas: