Scanf C funktionsbeskrivning
Scanf C funktionsbeskrivning

Video: Scanf C funktionsbeskrivning

Video: Scanf C funktionsbeskrivning
Video: MOST VALUABLE RARE JAPAN coins of value - numismatics 2024, November
Anonim

I den här artikeln betraktas scanf()-funktionen i en allmän form utan hänvisning till en specifik standard, så data från alla C99, C11, C++11, C++14 standarder ingår här. Kanske, i vissa standarder, fungerar funktionen med skillnader från materialet som presenteras i artikeln.

scanf C-funktion - beskrivning

scanf() är en funktion som finns i rubrikfilerna stdio.h(C) och cstdio(C++), även känd som formaterad programingång. scanf läser tecken från standardinmatningsströmmen (stdin) och konverterar dem enligt formatet och skriver dem sedan till de angivna variablerna. Format - innebär att uppgifterna konverteras till en viss form vid mottagandet. Sålunda beskrivs scanf C-funktionen:

scanf("%format", &variabel1[, &variabel2, […]), där variabler skickas som adresser. Anledningen till detta sätt att skicka variabler till en funktion är uppenbar: som ett resultat av arbete returnerar den ett värde som indikerar förekomsten av fel, sådet enda sättet att ändra värdena på variabler är att skicka med adress. Tack vare denna metod kan funktionen också bearbeta data av alla slag.

Vissa programmerare hänvisar till funktioner som scanf() eller printf() som procedurer på grund av analogin med andra språk.

Scanf tillåter inmatning av alla grundläggande språktyper: char, int, float, string, etc. När det gäller variabler av typen sträng, finns det inget behov av att ange adresstecknet - "&", eftersom variabeln av typen sträng är en array och dess namn är adressen till det första elementet i arrayen i datorns minne.

Använder C i C++
Använder C i C++

Datainmatningsformat eller kontrollsträng

Börja med att titta på scanf C-funktionsexemplet från beskrivningen.


include int main() { int x; while (scanf("%d", &x)==1) printf("%d\n", x); returnera 0; //krav för linux-system }

Inmatningsformatet består av följande fyra parametrar: %[width][modifiers] typ. I det här fallet är "%"-tecknet och typen obligatoriska parametrar. Det vill säga, minimiformatet ser ut så här: "%s", "%d" och så vidare.

I allmänhet är tecknen som utgör formatsträngen indelade i:

  • formatspecifikationer - allt som börjar med %;
  • separerande eller blanksteg - de är mellanslag, tab(t), nyrad (n);
  • tecken andra än blanksteg.

Funktionen kanske inte är säker.

Använd scanf_s() istället för scanf().

(meddelande från Visual Studio)

Typ, eller formatspecifikationer, eller konverteringstecken, eller kontrolltecken

binär kod
binär kod

En scanf C-deklaration måste innehålla minst en formatspecifikation, som anges i slutet av uttryck som börjar med "%". Den talar om för programmet vilken typ av data man kan förvänta sig när man går in, vanligtvis från tangentbordet. Lista över alla formatspecifikationer i tabellen nedan.

Typ Meaning
1 %c Programmet väntar på en teckeninmatning. Variabeln som ska skrivas måste vara av teckentypen char.
2 %d Programmet förväntar sig inmatning av ett decim altal av heltalstyp. Variabeln måste vara av typen int.
3

%i

Programmet förväntar sig inmatning av ett decim altal av heltalstyp. Variabeln måste vara av typen int.
4 %e, %E Programmet förväntar sig att ange ett flyttal (komma) i exponentiell form. Variabeln måste vara av typen float.
5 %f Programmet förväntar sig ett flyttal (komma). Variabeln måste vara av typen float.
6 %g, %G Programmet förväntar sig ett flyttal (komma). Variabeln måste vara av typen float.
7 %a Programmet förväntar sig ett flyttal (komma). Variabeln måste vara av typen float.
8 %o Programmet förväntar sig ett okt alt tal. Variabeln måste vara av typen int.
9 %s

Programmet väntar på att en sträng ska matas in. En sträng är en uppsättning av alla tecken upp till det första avgränsningstecknet som påträffas. Variabeln måste vara av typen string.

10 %x, %X Programmet väntar på ett hexadecim alt tal. Variabeln måste vara av typen int.
11 %p Variabel förväntar sig pekare. Variabeln måste vara av pekartyp.
12 %n Skriver till en variabel ett heltalsvärde lika med antalet tecken som hittills lästs av scanf-funktionen.
13 %u Programmet läser ett osignerat heltal. Variabeltypen måste vara heltal utan tecken.
14 %b Programmet väntar på ett binärt tal. Variabeln måste vara av typen int.
15 % Skannad teckenuppsättning. Programmet väntar på att tecken ska matas in.från den begränsade poolen som anges mellan hakparenteser. scanf kommer att fungera så länge det finns tecken från den angivna uppsättningen i inmatningsströmmen.
16 %% Signa "%".

Tecken i formatsträngen

C++-kod
C++-kod

stjärnsymbol ()

Asterisken () är en flagga som indikerar att tilldelningsoperationen ska undertryckas. En asterisk placeras omedelbart efter "%"-tecknet. Till exempel


scanf("%d%c%d", &x, &y); //ignorera tecken mellan två heltal. scanf("%s%d%s", str, str2); //ignorera heltal mellan två strängar.

Det vill säga, om du anger raden "45-20" i konsolen kommer programmet att göra följande:

  1. Variabel "x" kommer att tilldelas värdet 45.
  2. Variabel "y" kommer att tilldelas värdet 20.
  3. Och minustecknet (streck) "-" kommer att ignoreras tack vare "%c".

Width (eller fältbredd)

Detta är ett heltal mellan "%"-tecknet och formatspecifikationen som anger det maximala antalet tecken som ska läsas i den aktuella läsoperationen.


scanf("%20s", str); //läs de första 20 tecknen från inmatningsflödet

Det finns några viktiga saker att tänka på:

  1. scanf kommer att avslutas om det stöter på ett separatortecken, även om det inte räknade 20 tecken.
  2. Om mer än 20 tecken skrivs in, kommer endast de första 20 tecknen att skrivas till str.

Modifieraretyp (eller precision)

stänkkod
stänkkod

Dessa är speciella flaggor som ändrar typen av data som förväntas för inmatning. Flaggan anges till vänster om typspecifikationen:

  • L eller l (litet L) När "l" används med specifikationerna d, i, o, u, x, talar flaggan om för programmet att long int-inmatning förväntas. När du använder "l" med e- eller f-specifikationen talar flaggan om för programmet att det bör förvänta sig ett dubbelt värde. Användningen av "L" talar om för programmet att en lång dubbel förväntas. Användningen av "l" med "c" och "s" specifikationer talar om för programmet att två-byte tecken som wchar_t förväntas. Till exempel "%lc", "%ls", "%l[asd]".
  • h är en flagga som indikerar den korta typen.
  • hh - indikerar att variabeln är en pekare till ett tecken med tecken eller ett tecken utan tecken. Flaggan kan användas med specifikationerna d, i, o, u, x, n.
  • ll (två små L) - indikerar att variabeln är en pekare till ett värde av typen signed long long int eller unsigned long long int. Flaggan används med specifikationer: d, i, o, u, x, n.
  • j - indikerar att variabeln är en pekare till typen intmax_t eller uintmax_t från rubrikfilen stdint.h. Används med specifikationer: d, i, o, u, x, n.
  • z - indikerar att variabeln är en pekare till typen size_t, vars definition finns i stddef.h. Används med specifikationer: d, i, o, u, x, n.
  • t - indikerar att variabeln är en pekare till typen ptrdiff_t. Definition pådenna typ finns i stddef.h. Används med specifikationer: d, i, o, u, x, n.

Tydligare kan bilden med modifierare representeras som en tabell. En sådan beskrivning av scanf C för programmerare blir tydligare.

Typ specifikationer och modifierare
Typ specifikationer och modifierare

Andra tecken

Alla tecken som påträffas i formatet kommer att kasseras. Samtidigt bör det noteras att närvaron av blanksteg eller separatortecken (nyrad, mellanslag, tab) i kontrollsträngen kan leda till olika beteende hos funktionen. I en version kommer scanf() att läsa utan att spara något antal avgränsare tills den stöter på ett annat tecken än avgränsaren, och i en annan version spelar mellanslag (endast de) ingen roll och uttrycket "%d + %d" motsvarar "% d+%d".

Exempel på C++-kod
Exempel på C++-kod

Exempel

Låt oss titta på några exempel som hjälper dig att tänka och bättre förstå hur funktionen fungerar.


scanf("%3s", str); //om du anger strängen "1d2s3d1;3" i konsolen kommer endast "1d2" att skrivas till str scanf("%dminus%d", &x, &y); //minus tecken mellan två siffror kommer att kasseras scanf("%5[0-9]", str); // tecken kommer att skrivas in i str tills det finns 5 tecken och tecknen är siffror från 0 till 9. scanf("%lf", &d); //expect double input scanf("%hd", &x); //förväntat antal av typen short scanf("%hu", &y); //expect unsigned number short scanf("lx", &z); //förväntat antal typ lång int

FrånExemplen nedan visar hur det förväntade antalet ändras med olika symboler.

scanf C - beskrivning för nybörjare

Det här avsnittet kommer att vara användbart för nybörjare. Ofta måste du ha till hands inte så mycket en fullständig beskrivning av scanf C som detaljerna om hur funktionen fungerar.

  • Denna funktion är något föråldrad. Det finns flera olika implementeringar i bibliotek av olika versioner. Till exempel den förbättrade scanf S C-funktionen, en beskrivning av den finns på Microsofts webbplats.
  • Antalet specifikationer i formatet måste matcha antalet argument som skickas till funktionen.
  • Indataströmselement får endast separeras med separator: mellanslag, tabb, ny rad. Komma, semikolon, punkt, etc. - dessa tecken är inte avgränsare för scanf()-funktionen.
  • Om scanf stöter på ett separatortecken, stoppas inmatningen. Om det finns mer än en variabel att läsa, kommer scanf att gå vidare till att läsa nästa variabel.
  • Den minsta inkonsekvens i indataformatet leder till oförutsägbara resultat av programmet. Tja, om programmet bara slutar med ett fel. Men ofta fortsätter programmet att fungera och gör det fel.
  • scanf("%20s …", …); Om indataströmmen överstiger 20 tecken, kommer scanf att läsa de första 20 tecknen och antingen avbryta eller gå vidare till att läsa nästa variabel, om en sådan är specificerad. I det här fallet kommer nästa anrop till scanf att fortsätta läsa inmatningsströmmen från den punkt där arbetet med det föregående anropet till scanf slutade. Om när man läser de första 20tecken, ett avgränsningstecken påträffas, kommer scanf att avbryta eller fortsätta att läsa nästa variabel, även om den inte läste 20 tecken för den första variabeln. I det här fallet kommer alla olästa tecken att kopplas till nästa variabel.
  • Om uppsättningen av skannade tecken börjar med ett "^", så kommer scanf att läsa data tills den stöter på ett avgränsningstecken eller ett tecken från uppsättningen. Till exempel kommer "%[^A-E1-5]" att läsa data från strömmen tills ett av de engelska versalerna från A till E eller ett av siffrorna från 1 till 5 påträffas.
  • Funktionen scanf C, som beskrivs, returnerar ett tal lika med det framgångsrika antalet skrivningar till variabler. Om scanf skriver 3 variabler kommer resultatet av funktionen att returnera talet 3. Om scanf inte kunde skriva några variabler blir resultatet 0. Och slutligen, om scanf inte kunde starta alls av någon anledning, resultatet blir EOF.
  • Om scanf()-funktionen slutade felaktigt. Till exempel, scanf("%d", &x) - ett nummer förväntades, men tecken togs emot som inmatning. Nästa scanf()-anrop kommer att starta vid den punkt i inmatningsströmmen där det föregående funktionsanropet slutade. För att övervinna detta problem är det nödvändigt att bli av med problemkaraktärerna. Detta kan till exempel göras genom att anropa scanf("%s"). Det vill säga, funktionen kommer att läsa en sträng av tecken och kasta bort den. På det här knepiga sättet kan du fortsätta att ange nödvändiga uppgifter.
  • I vissa implementeringar av scanf() är "-" inte tillåtet i den skannade teckenuppsättningen.
  • Specifieraren "%c" läser varje tecken från strömmen. Det vill säga, den läser också avskiljartecknet. För att hoppa över avgränsningstecknet och fortsätta läsa det önskade tecknet, kan du använda "%1s".
  • När du använder "c"-specifikationen är det tillåtet att använda bredden "%10c", men då måste en uppsättning element av typen char skickas som en variabel till scanf-funktionen.
  • "%[a-z]" betyder "alla små bokstäver i det engelska alfabetet", och "%[z-a]" betyder bara 3 tecken: 'z', 'a', '-'. Med andra ord betyder "-"-tecknet ett intervall endast om det är mellan två tecken som är i rätt ordning. Om "-" är i slutet av ett uttryck, i början eller i fel ordning av tecken på vardera sidan av dem, så är det bara ett bindestreck, inte ett intervall.
C++-kod
C++-kod

Slutsats

Detta avslutar beskrivningen av scanf C. Detta är en trevlig praktisk funktion för att arbeta i små program och när man använder den procedurmässiga programmeringsmetoden. Den största nackdelen är dock antalet oförutsägbara fel som kan uppstå när man använder scanf. Därför hålls beskrivningen av scanf C vid programmering bäst framför dina ögon. I stora professionella projekt används iostreams, på grund av att de har kapacitet på högre nivå, de är bättre på att fånga och hantera fel, och även arbeta med betydande mängder information. Det bör också noteras att beskrivningen av scanf C på ryska är tillgänglig på många nätverkskällor, såväl som exempel på detanvändning, på grund av funktionens ålder. Därför kan du vid behov alltid hitta svaret på de tematiska forumen.