Scanf C funksjonsbeskrivelse
Scanf C funksjonsbeskrivelse

Video: Scanf C funksjonsbeskrivelse

Video: Scanf C funksjonsbeskrivelse
Video: Монета 1 юань 2012 г. из Китая # Шорты 2024, November
Anonim

I denne artikkelen betraktes scanf()-funksjonen i en generell form uten referanse til en spesifikk standard, så data fra alle C99, C11, C++11, C++14 standarder er inkludert her. Kanskje, i noen standarder, fungerer funksjonen med forskjeller fra materialet presentert i artikkelen.

scanf C-funksjon - beskrivelse

scanf() er en funksjon som ligger i headerfilene stdio.h(C) og cstdio(C++), også kjent som formatert programinndata. scanf leser tegn fra standard input-stream (stdin) og konverterer dem i henhold til formatet, og skriver dem deretter til de spesifiserte variablene. Format - betyr at dataene konverteres til en bestemt form ved mottak. Dermed er scanf C-funksjonen beskrevet:

scanf("%format", &variable1[, &variable2, […]), der variabler sendes som adresser. Årsaken til denne måten å overføre variabler til en funksjon er åpenbar: som et resultat av arbeid returnerer den en verdi som indikerer tilstedeværelsen av feil, såden eneste måten å endre verdiene til variabler på er ved å sende adresse. Takket være denne metoden kan funksjonen også behandle data av enhver type.

Noen programmerere refererer til funksjoner som scanf() eller printf() som prosedyrer på grunn av analogien med andre språk.

Scanf tillater inntasting av alle grunnleggende språktyper: char, int, float, string, etc. Når det gjelder variabler av typen streng, er det ikke nødvendig å spesifisere adressetegnet - "&", siden variabelen av typen streng er en matrise, og navnet er adressen til det første elementet i matrisen i datamaskinens minne.

Bruker C i C++
Bruker C i C++

Dataregistreringsformat eller kontrollstreng

Begynn med å se på scanf C-funksjonseksemplet fra beskrivelsen.


include int main() { int x; while (scanf("%d", &x)==1) printf("%d\n", x); returner 0; //krav for linux-systemer }

Inndataformatet består av følgende fire parametere: %[width][modifiers] type. I dette tilfellet er "%"-tegnet og typen obligatoriske parametere. Det vil si at minimumsformatet ser slik ut: «%s», «%d» og så videre.

Generelt er tegnene som utgjør formatstrengen delt inn i:

  • formatspesifikasjoner - alt som begynner med %;
  • skillende tegn eller mellomrom - de er mellomrom, tabulator(t), nylinje (n);
  • andre tegn enn mellomrom.

Funksjonen er kanskje ikke sikker.

Bruk scanf_s() i stedet for scanf().

(melding fra Visual Studio)

Type- eller formatspesifikasjoner, eller konverteringstegn, eller kontrolltegn

binær kode
binær kode

En scanf C-deklarasjon må inneholde minst en formatspesifikasjon, som er spesifisert på slutten av uttrykk som begynner med "%". Den forteller programmet hvilken type data du kan forvente når du går inn, vanligvis fra tastaturet. Liste over alle formatspesifikasjoner i tabellen nedenfor.

Type Meaning
1 %c Programmet venter på inntasting av tegn. Variabelen som skal skrives må være av tegntypen char.
2 %d Programmet forventer inntasting av et desim altall av heltallstype. Variabelen må være av typen int.
3 %i

Programmet forventer inntasting av et desim altall av heltallstype. Variabelen må være av typen int.

4 %e, %E Programmet forventer å legge inn et flyttall (komma) i eksponentiell form. Variabelen må være av typen float.
5 %f Programmet forventer et flyttallnummer (komma). Variabelen må være av typen float.
6 %g, %G Programmet forventer et flyttallnummer (komma). Variabelen må være av typen float.
7 %a Programmet forventer et flyttallnummer (komma). Variabelen må være av typen float.
8 %o Programmet forventer et okt alt tall. Variabelen må være av typen int.
9 %s Programmet venter på at en streng skal legges inn. En streng er et sett med alle tegn opp til det første skilletegnet som påtreffes. Variabelen må være av typen string.
10 %x, %X Programmet venter på et heksadesim alt tall. Variabelen må være av typen int.
11 %p Variabel forventer pekerinndata. Variabelen må være av pekertype.
12 %n Skriver til en variabel en heltallsverdi lik antall tegn som er lest så langt av scanf-funksjonen.
13 %u Programmet leser et usignert heltall. Variabeltypen må være heltall uten fortegn.
14 %b Programmet venter på et binært tall. Variabelen må være av typen int.
15 %

Skannet tegnsett. Programmet venter på at tegn skal legges inn.fra det begrensede bassenget angitt mellom firkantede parenteser. scanf vil fungere så lenge det er tegn fra det angitte settet på inndatastrømmen.

16 %% Sign "%".

Tegn i formatstrengen

C++ kode
C++ kode

Stjernesymbol ()

Asterisken () er et flagg som indikerer at tilordningsoperasjonen bør undertrykkes. En stjerne plasseres umiddelbart etter "%"-tegnet. For eksempel


scanf("%d%c%d", &x, &y); //ignorer tegn mellom to heltall. scanf("%s%d%s", str, str2); //ignorer heltall mellom to strenger.

Det vil si at hvis du skriver inn linjen "45-20" i konsollen, vil programmet gjøre følgende:

  1. Variabel "x" vil bli tildelt verdien 45.
  2. Variabel "y" vil bli tildelt verdien 20.
  3. Og minustegnet (bindestrek) "-" vil bli ignorert takket være "%c".

Width (eller feltbredde)

Dette er et heltall mellom "%"-tegnet og formatspesifikasjonen som spesifiserer maksim alt antall tegn som skal leses i gjeldende leseoperasjon.


scanf("%20s", str); //les de første 20 tegnene fra inndatastrømmen

Det er noen viktige ting å huske på:

  1. scanf vil avsluttes hvis det støter på et skilletegn, selv om det ikke teller 20 tegn.
  2. Hvis mer enn 20 tegn skrives inn, vil bare de første 20 tegnene bli skrevet til str.

Modifierstype (eller presisjon)

splash-kode
splash-kode

Dette er spesielle flagg som endrer typen data som forventes for inndata. Flagget er spesifisert til venstre for typespesifikatoren:

  • L eller l (liten L) Når "l" brukes med spesifikasjonene d, i, o, u, x, forteller flagget programmet at det forventes lang int-inngang. Når du bruker "l" med e- eller f-spesifikasjonen, forteller flagget programmet at det bør forvente en dobbel verdi. Bruken av "L" forteller programmet at det forventes en lang dobbel. Bruken av "l" med "c" og "s" spesifikasjonene forteller programmet at to-byte tegn som wchar_t forventes. For eksempel "%lc", "%ls", "%l[asd]".
  • h er et flagg som indikerer den korte typen.
  • hh - indikerer at variabelen er en peker til en tegnverdi eller usignert tegnverdi. Flagget kan brukes med spesifikasjonene d, i, o, u, x, n.
  • ll (to små L-er) - indikerer at variabelen er en peker til en verdi av typen fortegn lang lang int eller usignert lang lang int. Flagget brukes med spesifikasjoner: d, i, o, u, x, n.
  • j - indikerer at variabelen er en peker til typen intmax_t eller uintmax_t fra stdint.h header-filen. Brukes med spesifikasjoner: d, i, o, u, x, n.
  • z - indikerer at variabelen er en peker til typen size_t, hvis definisjon er i stddef.h. Brukes med spesifikasjoner: d, i, o, u, x, n.
  • t - indikerer at variabelen er en peker til typen ptrdiff_t. Definisjon pådenne typen er i stddef.h. Brukes med spesifikasjoner: d, i, o, u, x, n.

Tydeligere kan bildet med modifikatorer representeres som en tabell. En slik beskrivelse av scanf C for programmerere vil være klarere.

Type spesifikasjoner og modifikatorer
Type spesifikasjoner og modifikatorer

Andre tegn

Alle tegn som oppstår i formatet vil bli forkastet. Samtidig bør det bemerkes at tilstedeværelsen av mellomrom eller skilletegn (nylinje, mellomrom, tabulator) i kontrollstrengen kan føre til forskjellig oppførsel av funksjonen. I en versjon vil scanf() lese uten å lagre noe antall skilletegn før den møter et annet tegn enn skilletegn, og i en annen versjon spiller ikke mellomrom (bare de) en rolle og uttrykket "%d + %d" tilsvarer "% d+%d".

Eksempel på C++-kode
Eksempel på C++-kode

Eksempler

La oss se på noen eksempler for å hjelpe deg å tenke og bedre forstå hvordan funksjonen fungerer.


scanf("%3s", str); //hvis du skriver inn strengen "1d2s3d1;3" i konsollen, vil bare "1d2" bli skrevet til str scanf("%dminus%d", &x, &y); //minustegn mellom to tall vil bli forkastet scanf("%5[0-9]", str); // tegn vil bli lagt inn i str til det er 5 tegn og tegnene er tall fra 0 til 9. scanf("%lf", &d); //forvent dobbel inngang scanf("%hd", &x); //forventet antall av typen short scanf("%hu", &y); //forvent usignert nummer kort scanf("lx", &z); //forventet antall type lang int

FraEksemplene nedenfor viser hvordan det forventede tallet endres ved hjelp av forskjellige symboler.

scanf C - beskrivelse for nybegynnere

Denne delen vil være nyttig for nybegynnere. Ofte må du ha for hånden, ikke så mye en fullstendig beskrivelse av scanf C som detaljene om hvordan funksjonen fungerer.

  • Denne funksjonen er noe foreldet. Det er flere forskjellige implementeringer i biblioteker av forskjellige versjoner. For eksempel den forbedrede scanf S C-funksjonen, en beskrivelse av denne finnes på Microsofts nettside.
  • Antallet spesifikasjoner i formatet må samsvare med antallet argumenter som sendes til funksjonen.
  • Input-strømelementer må bare skilles med skilletegn: mellomrom, tabulator, ny linje. Komma, semikolon, punktum osv. - disse tegnene er ikke skilletegn for scanf()-funksjonen.
  • Hvis scanf støter på et skilletegn, vil inntastingen stoppes. Hvis det er mer enn én variabel å lese, vil scanf gå videre til å lese den neste variabelen.
  • Den minste inkonsekvens i inndataformatet fører til uforutsigbare resultater av programmet. Vel, hvis programmet bare avsluttes med en feil. Men ofte fortsetter programmet å fungere og gjør det feil.
  • scanf("%20s …", …); Hvis inndatastrømmen overskrider 20 tegn, vil scanf lese de første 20 tegnene og enten avbryte eller gå videre til å lese neste variabel, hvis en er spesifisert. I dette tilfellet vil det neste anropet til scanf fortsette å lese inndatastrømmen fra punktet der arbeidet med det forrige anropet til scanf stoppet. Hvis når du leser de første 20tegn, et skilletegn oppdages, vil scanf avbryte eller fortsette å lese den neste variabelen, selv om den ikke leste 20 tegn for den første variabelen. I dette tilfellet vil alle uleste tegn bli knyttet til neste variabel.
  • Hvis settet med skannede tegn starter med et "^", vil scanf lese dataene til det møter et skilletegn eller et tegn fra settet. For eksempel vil "%[^A-E1-5]" lese data fra strømmen til ett av de store engelske tegnene fra A til E eller et av tallene fra 1 til 5 blir påtruffet.
  • Scanf C-funksjonen, som beskrevet, returnerer et tall som er lik det vellykkede antallet skrivinger til variabler. Hvis scanf skriver 3 variabler, vil suksessresultatet av funksjonen returnere tallet 3. Hvis scanf ikke kunne skrive noen variabler, vil resultatet være 0. Og til slutt, hvis scanf ikke kunne starte i det hele tatt av en eller annen grunn, resultatet vil være EOF.
  • Hvis scanf()-funksjonen ble avsluttet feil. For eksempel scanf("%d", &x) - et tall var forventet, men tegn ble mottatt som input. Det neste scanf()-kallet vil starte på punktet i inndatastrømmen der det forrige funksjonskallet sluttet. For å overvinne dette problemet, er det nødvendig å kvitte seg med problemkarakterene. Dette kan for eksempel gjøres ved å kalle scanf("%s"). Det vil si at funksjonen vil lese en streng med tegn og kaste den. På denne vanskelige måten kan du fortsette å legge inn nødvendige data.
  • I noen implementeringer av scanf(), er "-" ikke tillatt i det skannede tegnsettet.
  • «%c»-spesifikasjonen leser hvert tegn fra strømmen. Det vil si at den også leser skilletegn. For å hoppe over skilletegnet og fortsette å lese det ønskede tegnet, kan du bruke "%1s".
  • Når du bruker "c"-spesifikasjonen, er det tillatt å bruke bredden "%10c", men da må en rekke elementer av typen char sendes som en variabel til scanf-funksjonen.
  • "%[a-z]" betyr "alle små bokstaver i det engelske alfabetet", og "%[z-a]" betyr bare 3 tegn: 'z', 'a', '-'. Med andre ord betyr "-"-tegnet et område bare hvis det er mellom to tegn som er i riktig rekkefølge. Hvis "-" er på slutten av et uttrykk, i begynnelsen eller i feil rekkefølge av tegn på hver side av dem, er det bare en bindestrek, ikke et område.
C++ kode
C++ kode

Konklusjon

Dette avslutter beskrivelsen av scanf C. Dette er en fin hendig funksjon for å jobbe i små programmer og når du bruker den prosedyremessige programmeringsmetoden. Den største ulempen er imidlertid antallet uforutsigbare feil som kan oppstå ved bruk av scanf. Derfor er beskrivelsen av scanf C ved programmering best å holde foran øynene dine. I store faglige prosjekter brukes iostreams, på grunn av at de har evner på høyere nivå, de er bedre i stand til å fange opp og håndtere feil, og jobber også med betydelige mengder informasjon. Det bør også bemerkes at beskrivelsen av scanf C på russisk er tilgjengelig på mange nettverkskilder, så vel som eksempler på detbruk, på grunn av funksjonens alder. Derfor, om nødvendig, kan du alltid finne svaret på temaforumene.