Scanf C funktionsbeskrivelse
Scanf C funktionsbeskrivelse

Video: Scanf C funktionsbeskrivelse

Video: Scanf C funktionsbeskrivelse
Video: Market Segmentation (With Real World Examples) | From A Business Professor 2024, November
Anonim

I denne artikel betragtes scanf()-funktionen i en generel form uden reference til en specifik standard, så data fra enhver C99, C11, C++11, C++14 standarder er inkluderet her. Måske fungerer funktionen i nogle standarder med forskelle fra materialet præsenteret i artiklen.

scanf C-funktion - beskrivelse

scanf() er en funktion placeret i stdio.h(C) og cstdio(C++) header-filer, også kendt som formateret programinput. scanf læser tegn fra standardinputstrømmen (stdin) og konverterer dem i henhold til formatet og skriver dem derefter til de angivne variable. Format - betyder, at data konverteres til en bestemt form ved modtagelsen. Således er scanf C-funktionen beskrevet:

scanf("%format", &variabel1[, &variabel2, […]), hvor variabler sendes som adresser. Årsagen til denne måde at overføre variabler til en funktion på er indlysende: som et resultat af arbejde returnerer den en værdi, der angiver tilstedeværelsen af fejl, såden eneste måde at ændre værdierne af variabler på er ved at videregive adresse. Takket være denne metode kan funktionen også behandle data af enhver type.

Nogle programmører henviser til funktioner som scanf() eller printf() som procedurer på grund af analogien med andre sprog.

Scanf tillader input af alle grundlæggende sprogtyper: char, int, float, streng osv. I tilfælde af variabler af typen streng, er det ikke nødvendigt at specificere adressetegnet - "&", da variablen for type streng er et array, og dets navn er adressen på det første element i arrayet i computerens hukommelse.

Brug af C i C++
Brug af C i C++

Dataindtastningsformat eller kontrolstreng

Start med at se på scanf C-funktionseksemplet fra beskrivelsen.


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

Inputformatet består af følgende fire parametre: %[width][modifiers] type. I dette tilfælde er "%"-tegnet og typen obligatoriske parametre. Det vil sige, at minimumsformatet ser sådan ud: "%s", "%d" og så videre.

Generelt er tegnene, der udgør formatstrengen, opdelt i:

  • formatspecifikationer - alt, der begynder med %;
  • adskillende tegn eller mellemrum - de er mellemrum, tabulator(t), nylinje (n);
  • tegn bortset fra mellemrum.

Funktionen er muligvis ikke sikker.

Brug scanf_s() i stedet for scanf().

(besked fra Visual Studio)

Type- eller formatspecifikationer eller konverteringstegn eller kontroltegn

binær kode
binær kode

En scanf C-erklæring skal mindst indeholde en formatspecifikation, som er angivet i slutningen af udtryk, der begynder med "%". Det fortæller programmet, hvilken type data man kan forvente, når man indtaster, norm alt fra tastaturet. Liste over alle formatspecifikationer i tabellen nedenfor.

Type Meaning
1 %c Programmet venter på indtastning af tegn. Variablen, der skal skrives, skal være af tegntypen char.
2 %d Programmet forventer input af et decim altal af heltalstypen. Variablen skal være af typen int.
3

%i

Programmet forventer input af et decim altal af heltalstypen. Variablen skal være af typen int.
4 %e, %E Programmet forventer at indtaste et flydende kommatal (komma) i eksponentiel form. Variablen skal være af typen float.
5 %f Programmet forventer et flydende decim altal (komma). Variablen skal være af typen float.
6 %g, %G Programmet forventer et flydende decim altal (komma). Variablen skal være af typen float.
7 %a Programmet forventer et flydende decim altal (komma). Variablen skal være af typen float.
8 %o Programmet forventer et oktal tal. Variablen skal være af typen int.
9 %s

Programmet venter på, at der indtastes en streng. En streng er et sæt af alle tegn op til det første skilletegn, der stødes på. Variablen skal være af typen streng.

10 %x, %X Programmet venter på et hexadecim alt tal. Variablen skal være af typen int.
11 %p Variabel forventer pointerinput. Variablen skal være af pointertype.
12 %n Skriver til en variabel en heltalsværdi svarende til antallet af tegn, der indtil videre er læst af scanf-funktionen.
13 %u Programmet læser et heltal uden fortegn. Variabeltypen skal være heltal uden fortegn.
14 %b Programmet venter på et binært tal. Variablen skal være af typen int.
15 % Scannet tegnsæt. Programmet venter på, at tegn skal indtastes.fra den begrænsede pulje angivet mellem firkantede parenteser. scanf vil virke, så længe der er tegn fra det angivne sæt på inputstrømmen.
16 %% Sign "%".

Tegn i formatstrengen

C++ kode
C++ kode

Stjernesymbol ()

Asterisken () er et flag, der angiver, at tildelingshandlingen skal undertrykkes. En stjerne er placeret umiddelbart efter "%"-tegnet. For eksempel


scanf("%d%c%d", &x, &y); //ignorer tegn mellem to heltal. scanf("%s%d%s", str, str2); //ignorer heltal mellem to strenge.

Det vil sige, hvis du indtaster linjen "45-20" i konsollen, vil programmet gøre følgende:

  1. Variabel "x" vil blive tildelt værdien 45.
  2. Variabel "y" vil blive tildelt værdien 20.
  3. Og minustegnet (bindestreg) "-" vil blive ignoreret takket være "%c".

Width (eller feltbredde)

Dette er et heltal mellem tegnet "%" og formatspecifikationen, der angiver det maksimale antal tegn, der skal læses i den aktuelle læseoperation.


scanf("%20s", str); //læs de første 20 tegn fra inputstrømmen

Der er et par vigtige ting at huske på:

  1. scanf afsluttes, hvis det støder på et separatortegn, selvom det ikke t alte 20 tegn.
  2. Hvis der indtastes mere end 20 tegn, vil kun de første 20 tegn blive skrevet til str.

Modifierstype (eller præcision)

splash kode
splash kode

Dette er specielle flag, der ændrer den type data, der forventes til input. Flaget er angivet til venstre for typespecifikationen:

  • L eller l (lille L) Når "l" bruges med specifikationerne d, i, o, u, x, fortæller flaget programmet, at der forventes lang int-input. Når du bruger "l" med e- eller f-specifikationen, fortæller flaget programmet, at det skal forvente en dobbelt værdi. Brugen af "L" fortæller programmet, at der forventes en lang double. Brugen af "l" med "c" og "s" specifikationerne fortæller programmet, at to-byte tegn som wchar_t forventes. For eksempel "%lc", "%ls", "%l[asd]".
  • h er et flag, der angiver den korte type.
  • hh - angiver, at variablen er en pegepind til en tegn- eller usigneret tegnværdi. Flaget kan bruges med specifikationerne d, i, o, u, x, n.
  • ll (to små L'er) - angiver, at variablen er en pegepind til en værdi af typen med fortegn long long int eller unsigned long long int. Flaget bruges med specifikationer: d, i, o, u, x, n.
  • j - angiver, at variablen er en pointer til typen intmax_t eller uintmax_t fra stdint.h header-filen. Brugt med specifikationer: d, i, o, u, x, n.
  • z - angiver, at variablen er en pointer til typen size_t, hvis definition er i stddef.h. Brugt med specifikationer: d, i, o, u, x, n.
  • t - angiver, at variablen er en pegepind til typen ptrdiff_t. Definition pådenne type er i stddef.h. Brugt med specifikationer: d, i, o, u, x, n.

Mere tydeligt kan billedet med modifikatorer repræsenteres som en tabel. En sådan beskrivelse af scanf C for programmører vil være klarere.

Typespecifikationer og modifikatorer
Typespecifikationer og modifikatorer

Andre tegn

Alle tegn, der stødes på i formatet, vil blive kasseret. Samtidig skal det bemærkes, at tilstedeværelsen af mellemrum eller separatortegn (nylinje, mellemrum, tabulator) i kontrolstrengen kan føre til forskellig adfærd af funktionen. I én version vil scanf() læse uden at gemme et antal separatorer, indtil den støder på et andet tegn end separatoren, og i en anden version spiller mellemrum (kun de) ikke en rolle og udtrykket "%d + %d" svarer til "% d+%d".

C++ kode eksempel
C++ kode eksempel

Eksempler

Lad os se på nogle eksempler for at hjælpe dig med at tænke og bedre forstå, hvordan funktionen fungerer.


scanf("%3s", str); //hvis du indtaster strengen "1d2s3d1;3" i konsollen, vil kun "1d2" blive skrevet til str scanf("%dminus%d", &x, &y); //minus tegn mellem to tal vil blive kasseret scanf("%5[0-9]", str); // tegn vil blive indtastet i str, indtil der er 5 tegn, og tegnene er tal fra 0 til 9. scanf("%lf", &d); //forvent dobbelt input scanf("%hd", &x); //forventet antal af typen short scanf("%hu", &y); //forvent usigneret nummer kort scanf("lx", &z); //forventet antal af typen lang int

FraEksemplerne nedenfor viser, hvordan det forventede tal ændres ved hjælp af forskellige symboler.

scanf C - beskrivelse for begyndere

Dette afsnit vil være nyttigt for begyndere. Ofte skal du have ved hånden, ikke så meget en komplet beskrivelse af scanf C som detaljerne om, hvordan funktionen fungerer.

  • Denne funktion er noget forældet. Der er flere forskellige implementeringer i biblioteker af forskellige versioner. For eksempel den forbedrede scanf S C-funktion, som en beskrivelse kan findes på Microsofts hjemmeside.
  • Antallet af specifikationer i formatet skal svare til antallet af argumenter, der sendes til funktionen.
  • Input-stream-elementer må kun adskilles af separatortegn: mellemrum, tabulator, ny linje. Komma, semikolon, punktum osv. - disse tegn er ikke separatorer for scanf()-funktionen.
  • Hvis scanf støder på et separatortegn, vil indtastningen blive stoppet. Hvis der er mere end én variabel at læse, vil scanf gå videre til at læse den næste variabel.
  • Den mindste inkonsistens i inputdataformatet fører til uforudsigelige resultater af programmet. Nå, hvis programmet bare ender med en fejl. Men ofte fortsætter programmet med at fungere og gør det forkert.
  • scanf("%20s …", …); Hvis inputstrømmen overstiger 20 tegn, vil scanf læse de første 20 tegn og enten afbryde eller gå videre til at læse den næste variabel, hvis en sådan er angivet. I dette tilfælde vil det næste kald til scanf fortsætte med at læse inputstrømmen fra det punkt, hvor arbejdet med det forrige kald til scanf stoppede. Hvis du læser de første 20tegn, der stødes på et skilletegn, vil scanf afbryde eller fortsætte med at læse den næste variabel, selvom den ikke læste 20 tegn for den første variabel. I dette tilfælde vil alle ulæste tegn blive knyttet til den næste variabel.
  • Hvis sættet af scannede tegn starter med et "^", så læser scanf dataene, indtil det støder på et skilletegn eller et tegn fra sættet. For eksempel vil "%[^A-E1-5]" læse data fra strømmen, indtil et af de store engelske tegn fra A til E eller et af tallene fra 1 til 5 stødes på.
  • Scanf C-funktionen, som beskrevet, returnerer et tal svarende til det vellykkede antal skrivninger til variabler. Hvis scanf skriver 3 variabler, vil succesresultatet af funktionen returnere tallet 3. Hvis scanf ikke kunne skrive nogen variable, så vil resultatet være 0. Og endelig, hvis scanf slet ikke kunne starte af en eller anden grund, resultatet vil være EOF.
  • Hvis scanf()-funktionen sluttede forkert. For eksempel scanf("%d", &x) - et tal var forventet, men tegn blev modtaget som input. Det næste scanf()-kald starter på det punkt i inputstrømmen, hvor det forrige funktionskald sluttede. For at overvinde dette problem er det nødvendigt at slippe af med problemkaraktererne. Dette kan for eksempel gøres ved at kalde scanf("%s"). Det vil sige, at funktionen vil læse en streng af tegn og smide den væk. På denne vanskelige måde kan du fortsætte med at indtaste de nødvendige data.
  • I nogle implementeringer af scanf() er "-" ikke tilladt i det scannede tegnsæt.
  • "%c"-specifikationen læser hvert tegn fra strømmen. Det vil sige, at den også læser skilletegn. For at springe afgrænsningstegnet over og fortsætte med at læse det ønskede tegn, kan du bruge "%1s".
  • Når du bruger "c"-specifikationen, er det tilladt at bruge bredden "%10c", men så skal et array af elementer af typen char sendes som en variabel til scanf-funktionen.
  • "%[a-z]" betyder "alle små bogstaver i det engelske alfabet", og "%[z-a]" betyder kun 3 tegn: 'z', 'a', '-'. Med andre ord betyder "-" tegnet kun et område, hvis det er mellem to tegn, der er i den rigtige rækkefølge. Hvis "-" er i slutningen af et udtryk, i begyndelsen eller i den forkerte rækkefølge af tegn på hver side af dem, så er det kun en bindestreg, ikke et område.
C++ kode
C++ kode

Konklusion

Dette afslutter beskrivelsen af scanf C. Dette er en fin, praktisk funktion til at arbejde i små programmer og ved brug af den proceduremæssige programmeringsmetode. Den største ulempe er dog antallet af uforudsigelige fejl, der kan opstå ved brug af scanf. Derfor er beskrivelsen af scanf C ved programmering bedst at have for øjnene af dig. I store professionelle projekter bruges iostreams, på grund af at de har evner på højere niveau, de er bedre i stand til at fange og håndtere fejl, og arbejder desuden med betydelige mængder information. Det skal også bemærkes, at beskrivelsen af scanf C på russisk er tilgængelig på mange netværkskilder, såvel som eksempler på detbrug på grund af funktionens alder. Derfor kan du om nødvendigt altid finde svaret på de tematiske fora.