Scanf C -toiminnon kuvaus
Scanf C -toiminnon kuvaus

Video: Scanf C -toiminnon kuvaus

Video: Scanf C -toiminnon kuvaus
Video: Mitä on markkinointiviestintä? Kolme tärkeintä tekijää mitkä kannattaa tietää | Ammattijohtaja.fi 2024, Saattaa
Anonim

Tässä artikkelissa scanf()-funktiota tarkastellaan yleisessä muodossa ilman viittausta tiettyyn standardiin, joten kaikki C99, C11, C++11, C++14 standardit sisältävät tiedot. Ehkä joissakin standardeissa funktio toimii poikkeamalla artikkelissa esitetystä materiaalista.

scanf C -toiminto - kuvaus

scanf() on stdio.h(C)- ja cstdio(C++)-otsikkotiedostoissa sijaitseva funktio, joka tunnetaan myös muotoiltuna ohjelmasyötteenä. scanf lukee merkit vakiosyöttövirrasta (stdin) ja muuntaa ne muodon mukaan ja kirjoittaa ne sitten määritettyihin muuttujiin. Muoto - tarkoittaa, että tiedot muunnetaan tiettyyn muotoon vastaanotettaessa. Siten scanf C -funktio on kuvattu:

scanf("%muoto", &muuttuja1[, &muuttuja2, […]), jossa muuttujat välitetään osoitteina. Syy tähän tapaan siirtää muuttujia funktiolle on ilmeinen: työn tuloksena se palauttaa arvon, joka ilmaisee virheiden olemassaolon, jotenAinoa tapa muuttaa muuttujien arvoja on osoitteen ohittaminen. Tämän menetelmän ansiosta funktio voi myös käsitellä kaikentyyppisiä tietoja.

Jotkin ohjelmoijat viittaavat funktioihin, kuten scanf() tai printf(), proseduureiksi, koska ne ovat analogisia muihin kieliin.

Scanf mahdollistaa kaikkien peruskielityyppien syöttämisen: char, int, float, string jne. Merkkijonotyyppisten muuttujien tapauksessa osoitemerkkiä - "&" ei tarvitse määrittää, koska merkkijonon muuttuja on taulukko ja sen nimi on tietokoneen muistissa olevan taulukon ensimmäisen elementin osoite..

C:n käyttö C++:ssa
C:n käyttö C++:ssa

Tietojen syöttömuoto tai ohjausmerkkijono

Aloita katsomalla kuvauksen esimerkkiä scanf C -funktiosta.


include int main() { int x; while (scanf("%d", &x)==1) printf("%d\n", x); paluu 0; //vaatimus linux-järjestelmille }

Syötemuoto koostuu seuraavista neljästä parametrista: %[width][modifiers]-tyyppi. Tässä tapauksessa "%"-merkki ja tyyppi ovat pakollisia parametreja. Eli vähimmäismuoto näyttää tältä: "%s", "%d" ja niin edelleen.

Yleensä muotomerkkijonon muodostavat merkit on jaettu:

  • muotomääritykset - mikä tahansa, joka alkaa %;
  • erottimet tai välilyönnit - ne ovat välilyönti, sarkain(t), rivinvaihto (n);
  • muut merkit kuin välilyönnit.

Toiminta ei ehkä ole turvallinen.

Käytä scanf_s():tä scanf(:n) sijaan.

(viesti Visual Studiolta)

Tyyppi- tai muotomääritykset tai muunnosmerkit tai ohjausmerkit

binäärikoodi
binäärikoodi

Scanf C -ilmoituksen tulee sisältää vähintään muotomäärittäjä, joka määritetään "%:lla" alkavien lausekkeiden lopussa. Se kertoo ohjelmalle, minkä tyyppisiä tietoja se odottaa syötettäessä, yleensä näppäimistöltä. Luettelo kaikista muotomäärityksistä alla olevassa taulukossa.

Tyyppi Merkitys
1 %c Ohjelma odottaa merkin syöttöä. Kirjoitettavan muuttujan on oltava merkkityyppiä char.
2 %d Ohjelma odottaa syötettävän kokonaislukutyypin desimaaliluvun. Muuttujan on oltava tyyppiä int.
3 %i

Ohjelma odottaa syötettävän kokonaislukutyypin desimaaliluvun. Muuttujan on oltava tyyppiä int.

4 %e, %E Ohjelma odottaa syöttävänsä liukulukunumeron (pilkun) eksponentiaalisessa muodossa. Muuttujan on oltava tyyppiä float.
5 %f Ohjelma odottaa liukulukua (pilkkua). Muuttujan on oltava tyyppiä float.
6 %g, %G Ohjelma odottaa liukulukua (pilkkua). Muuttujan on oltava tyyppiä float.
7 %a Ohjelma odottaa liukulukua (pilkkua). Muuttujan on oltava tyyppiä float.
8 %o Ohjelma odottaa oktaalilukua. Muuttujan on oltava tyyppiä int.
9 %s Ohjelma odottaa merkkijonon syöttämistä. Merkkijono on joukko merkkejä ensimmäiseen havaittuun erotinmerkkiin asti. Muuttujan on oltava tyyppiä string.
10 %x, %X Ohjelma odottaa heksadesimaalilukua. Muuttujan on oltava tyyppiä int.
11 %p Muuttuja odottaa osoitinsyöttöä. Muuttujan on oltava osoitintyyppinen.
12 %n Kirjoittaa muuttujaan kokonaisluvun, joka on yhtä suuri kuin scanf-funktion tähän mennessä lukemien merkkien määrä.
13 %u Ohjelma lukee etumerkittömän kokonaisluvun. Muuttujan tyypin on oltava etumerkitön kokonaisluku.
14 %b Ohjelma odottaa binäärilukua. Muuttujan on oltava tyyppiä int.
15 %

Skannattu merkistö. Ohjelma odottaa merkkien syöttämistä.hakasulkeissa määritellystä rajoitetusta joukosta. scanf toimii niin kauan kuin syöttövirrassa on merkkejä määritetystä sarjasta.

16 %% Allekirjoita "%".

merkit muodossa merkkijono

C++ koodi
C++ koodi

Tähtisymboli ()

Tähti () on lippu, joka osoittaa, että määritystoiminto tulee estää. Asteriski sijoitetaan välittömästi "%"-merkin jälkeen. Esimerkiksi


scanf("%d%c%d", &x, &y); //Ohita merkki kahden kokonaisluvun välillä. scanf("%s%d%s", str, str2); //jätä huomioimatta kahden merkkijonon välinen kokonaisluku.

Toisin sanoen, jos syötät konsoliin rivin "45-20", ohjelma tekee seuraavaa:

  1. Muuttujalle "x" annetaan arvo 45.
  2. Muuttujalle "y" annetaan arvo 20.
  3. Ja miinusmerkki (viiva) "-" ohitetaan "%c" ansiosta.

Leveys (tai kentän leveys)

Tämä on kokonaisluku "%"-merkin ja muotomääritteen välillä, joka määrittää nykyisessä lukutoiminnossa luettavien merkkien enimmäismäärän.


scanf("%20s", str); //lue ensimmäiset 20 merkkiä syöttövirrasta

Muista muutama tärkeä asia:

  1. scanf päättyy, jos se kohtaa erotinmerkin, vaikka siinä ei olisikaan laskettu 20 merkkiä.
  2. Jos syötetään yli 20 merkkiä, vain ensimmäiset 20 merkkiä kirjoitetaan str.

Muokkaajattyyppi (tai tarkkuus)

splash koodi
splash koodi

Nämä ovat erityisiä lippuja, jotka muokkaavat syötettävän tiedon tyyppiä. Lippu on määritetty tyyppimääritteen vasemmalla puolella:

  • L tai l (pieni L) Kun "l":tä käytetään määritteiden d, i, o, u, x kanssa, lippu kertoo ohjelmalle, että pitkä int-syöttö on odotettavissa. Kun käytetään "l":tä e- tai f-määritteen kanssa, lippu kertoo ohjelmalle, että sen pitäisi odottaa kaksinkertaista arvoa. "L":n käyttö kertoo ohjelmalle, että pitkä tupla on odotettavissa. "l":n käyttö "c"- ja "s"-määritteiden kanssa kertoo ohjelmalle, että kaksitavuisia merkkejä, kuten wchar_t, odotetaan. Esimerkiksi "%lc", "%ls", "%l[asd]".
  • h on lippu, joka osoittaa lyhyen tyypin.
  • hh - osoittaa, että muuttuja on osoitin etumerkilliseen tai etumerkittömään merkkiin. Lippua voidaan käyttää määritteiden d, i, o, u, x, n kanssa.
  • ll (kaksi pientä L-kirjainta) - osoittaa, että muuttuja on osoitin arvoon, jonka tyyppi on etumerkillinen long long int tai etumerkitön pitkä long int. Lippua käytetään määritteiden kanssa: d, i, o, u, x, n.
  • j - osoittaa, että muuttuja on osoitin intmax_t- tai uintmax_t-tyyppiin stdint.h-otsikkotiedostosta. Käytetään määritteiden kanssa: d, i, o, u, x, n.
  • z - osoittaa, että muuttuja on osoitin size_t-tyyppiin, jonka määritelmä on tiedostossa stddef.h. Käytetään määritteiden kanssa: d, i, o, u, x, n.
  • t - osoittaa, että muuttuja on osoitin ptrdiff_t-tyyppiin. Määritelmä päällätämä tyyppi on tiedostossa stddef.h. Käytetään määritteiden kanssa: d, i, o, u, x, n.

Selvemmin kuva, jossa on muunnoksia, voidaan esittää taulukkona. Tällainen kuvaus Scanf C:stä ohjelmoijille on selkeämpi.

Tyyppimääritykset ja modifikaattorit
Tyyppimääritykset ja modifikaattorit

Muut hahmot

Kaikki muodossa havaitut merkit hylätään. Samalla on huomioitava, että välilyöntien tai erotinmerkkien (uusirivi, välilyönti, sarkain) esiintyminen ohjausmerkkijonossa voi johtaa funktion erilaiseen käyttäytymiseen. Yhdessä versiossa scanf() lukee tallentamatta mitään erottimia, kunnes se kohtaa muun merkin kuin erottimen, ja toisessa versiossa välilyönneillä (vain ne) ei ole merkitystä ja lauseke "%d + %d" vastaa "% d+%d".

Esimerkki C++-koodista
Esimerkki C++-koodista

Esimerkkejä

Katsotaanpa joitain esimerkkejä, jotka auttavat sinua ajattelemaan ja ymmärtämään paremmin funktion toimintaa.


scanf("%3s", str); //jos syötät merkkijonon "1d2s3d1;3" konsoliin, vain "1d2" kirjoitetaan str scanf("%dminus%d", &x, &y); //miinusmerkit kahden numeron välillä hylätään scanf("%5[0-9]", str); // merkkejä syötetään str:ään, kunnes merkkiä on 5 ja merkit ovat numeroita välillä 0 - 9. scanf("%lf", &d); //odota kaksoissyöttöä scanf("%hd", &x); //odotettu tyypin short scanf("%hu", &y); //odota allekirjoittamatonta numeroa lyhyt scanf("lx", &z); //tyypin odotettu lukumäärä long int

AlkaenAlla olevat esimerkit osoittavat, kuinka odotettu luku muuttuu eri symbolien avulla.

scanf C - kuvaus aloittelijoille

Tämä osio on hyödyllinen aloittelijoille. Usein sinulla ei tarvitse olla niinkään täydellinen kuvaus funktiosta scanf C kuin toiminnon toiminnasta tiedot.

  • Tämä ominaisuus on jokseenkin vanhentunut. Eri versioiden kirjastoissa on useita erilaisia toteutuksia. Esimerkiksi parannettu scanf S C -toiminto, jonka kuvaus löytyy Microsoftin verkkosivuilta.
  • Muodossa olevien määritteiden lukumäärän on vastattava funktiolle välitettyjen argumenttien määrää.
  • Syötevirran elementit saa erottaa vain erotinmerkeillä: välilyönti, sarkain, uusi rivi. Pilkku, puolipiste, piste jne. - nämä merkit eivät erota scanf()-funktiota.
  • Jos scanf kohtaa erotinmerkin, syöttö keskeytyy. Jos luettavia muuttujia on useampi kuin yksi, scanf siirtyy lukemaan seuraavaa muuttujaa.
  • Pieninkin epäjohdonmukaisuus syöttötietomuodossa johtaa ohjelman arvaamattomiin tuloksiin. No, jos ohjelma vain päättyy virheeseen. Mutta usein ohjelma jatkaa toimintaansa ja tekee sen väärin.
  • scanf("%20s …", …); Jos syöttövirta ylittää 20 merkkiä, scanf lukee ensimmäiset 20 merkkiä ja joko keskeyttää tai siirtyy seuraavan muuttujan lukemiseen, jos sellainen on määritetty. Tässä tapauksessa seuraava kutsu scanf jatkaa syöttövirran lukemista kohdasta, jossa edellisen kutsun scanf työ pysähtyi. Jos luet ensimmäiset 20merkkiä, erotinmerkki havaitaan, scanf keskeyttää tai jatkaa seuraavan muuttujan lukemista, vaikka se ei olisi lukenut 20 merkkiä ensimmäisestä muuttujasta. Tässä tapauksessa kaikki lukemattomat merkit liitetään seuraavaan muuttujaan.
  • Jos skannattujen merkkien joukko alkaa kirjaimella "^", scanf lukee tietoja, kunnes se löytää erotinmerkin tai merkin sarjasta. Esimerkiksi "%[^A-E1-5]" lukee dataa virrasta, kunnes yksi isoista englanninkielisistä merkeistä A–E tai jokin numeroista 1–5 havaitaan.
  • Scanf C -funktio, kuten on kuvattu, palauttaa luvun, joka on yhtä suuri kuin onnistuneiden muuttujien kirjoitusten lukumäärä. Jos scanf kirjoittaa 3 muuttujaa, funktion onnistumistulos palauttaa luvun 3. Jos scanf ei voinut kirjoittaa yhtään muuttujaa, tulos on 0. Ja lopuksi, jos scanf ei jostain syystä voinut käynnistyä ollenkaan, tulos on EOF.
  • Jos scanf()-funktio päättyi väärin. Esimerkiksi scanf("%d", &x) - numero odotettiin, mutta syötteenä vastaanotettiin merkkejä. Seuraava scanf()-kutsu alkaa syöttövirran kohdasta, johon edellinen funktiokutsu päättyi. Tämän ongelman voittamiseksi on välttämätöntä päästä eroon ongelmahahmoista. Tämä voidaan tehdä esimerkiksi kutsumalla scanf("%s"). Toisin sanoen toiminto lukee merkkijonon ja heittää sen pois. Tällä hankalalla tavalla voit jatkaa tarvittavien tietojen syöttämistä.
  • Joissakin scanf(:n) toteutuksissa "-" ei ole sallittu tarkistetussa merkistössä.
  • "%c"-määrittäjä lukee jokaisen merkin virrasta. Eli se lukee myös erotinmerkin. Voit ohittaa erottimen ja jatkaa halutun merkin lukemista käyttämällä "%1s".
  • Käytettäessä "c"-määritystä on sallittua käyttää leveyttä "%10c", mutta silloin joukko char-tyypin elementtejä on välitettävä muuttujana scanf-funktiolle.
  • "%[a-z]" tarkoittaa "kaikkia englannin aakkosten pieniä kirjaimia" ja "%[z-a]" tarkoittaa vain kolmea merkkiä: 'z', 'a', '-'. Toisin sanoen "-"-merkki tarkoittaa aluetta vain, jos se on kahden oikeassa järjestyksessä olevan merkin välillä. Jos "-" on lausekkeen lopussa, alussa tai väärässä merkkijärjestyksessä molemmilla puolilla, se on vain yhdysmerkki, ei väli.
C++ koodi
C++ koodi

Johtopäätös

Tämä päättää scanf C:n kuvauksen. Tämä on mukava kätevä ominaisuus pienissä ohjelmissa työskentelyyn ja proseduuriohjelmointimenetelmää käytettäessä. Suurin haittapuoli on kuitenkin odottamattomien virheiden määrä, joita voi esiintyä skannausta käytettäessä. Siksi scanf C:n kuvaus ohjelmoinnissa on parasta pitää silmäsi edessä. Suurissa ammattiprojekteissa iostreameja käytetään, koska niillä on korkeamman tason ominaisuudet, ne pystyvät paremmin havaitsemaan ja käsittelemään virheitä sekä työskentelemään merkittävien tietomäärien kanssa. On myös huomattava, että venäjänkielinen scanf C:n kuvaus on saatavilla monista verkkolähteistä sekä esimerkkejä siitäkäyttöä toiminnon iän vuoksi. Siksi voit tarvittaessa aina löytää vastauksen temaattisilta foorumeilta.

Suositeltava: