Scanf C functiebeschrijving
Scanf C functiebeschrijving

Video: Scanf C functiebeschrijving

Video: Scanf C functiebeschrijving
Video: 30k winst uit onderneming: dan betaal je geen inkomstenbelasting. Bekijk hier de berekening 2024, Mei
Anonim

In dit artikel wordt de functie scanf() beschouwd in een algemene vorm zonder verwijzing naar een specifieke standaard, dus gegevens van alle C99-, C11-, C++11- en C++14-standaarden zijn hier opgenomen. Misschien werkt de functie in sommige standaarden met verschillen van het materiaal dat in het artikel wordt gepresenteerd.

scanf C-functie - beschrijving

scanf() is een functie die zich in de headerbestanden stdio.h(C) en cstdio(C++) bevindt, ook wel bekend als geformatteerde programma-invoer. scanf leest tekens uit de standaard invoerstroom (stdin) en converteert ze volgens het formaat en schrijft ze vervolgens naar de opgegeven variabelen. Formaat - houdt in dat de gegevens bij ontvangst worden geconverteerd naar een bepaalde vorm. Zo wordt de scanf C-functie beschreven:

scanf("%format", &variabele1[, &variabele2, […]), waar variabelen worden doorgegeven als adressen. De reden voor deze manier om variabelen aan een functie door te geven ligt voor de hand: als resultaat van werk geeft het een waarde terug die de aanwezigheid van fouten aangeeft, dusde enige manier om de waarden van variabelen te wijzigen, is door het adres door te geven. Dankzij deze methode kan de functie ook gegevens van elk type verwerken.

Sommige programmeurs verwijzen naar functies zoals scanf() of printf() als procedures vanwege de analogie met andere talen.

Scanf maakt invoer van alle basista altypen mogelijk: char, int, float, string, etc. In het geval van variabelen van het type string is het niet nodig om het adresteken - "&" op te geven, aangezien de variabele van het type string een array is en de naam het adres is van het eerste element van de array in het geheugen van de computer.

C gebruiken in C++
C gebruiken in C++

Gegevensinvoerformaat of besturingstekenreeks

Begin door te kijken naar het scanf C-functievoorbeeld uit de beschrijving.


include int main() { int x; while (scanf("%d", &x)==1) printf("%d\n", x); retourneer 0; //vereiste voor linux-systemen }

Het invoerformaat bestaat uit de volgende vier parameters: %[width][modifiers] type. In dit geval zijn het "%"-teken en het type verplichte parameters. Dat wil zeggen, het minimale formaat ziet er als volgt uit: "%s", "%d" enzovoort.

Over het algemeen zijn de tekens waaruit de opmaakreeks bestaat onderverdeeld in:

  • format-specificaties - alles wat begint met %;
  • tekens voor scheiding of spatie - dit zijn spatie, tab(t), nieuwe regel (n);
  • andere tekens dan witruimte.

Functie is mogelijk niet veilig.

Gebruik scanf_s() in plaats van scanf().

(bericht van Visual Studio)

Type, of formaatspecificaties, of conversietekens, of controletekens

binaire code
binaire code

Een scanf C-declaratie moet ten minste een formaatspecificatie bevatten, die wordt opgegeven aan het einde van uitdrukkingen die beginnen met "%". Het vertelt het programma welk type gegevens het kan verwachten bij het invoeren, meestal vanaf het toetsenbord. Lijst met alle formaatspecificaties in de onderstaande tabel.

Type

Betekenis

1 %c Het programma wacht op een tekeninvoer. De te schrijven variabele moet van het tekentype char zijn.
2 %d Het programma verwacht invoer van een decimaal getal van het type integer. De variabele moet van het type int. zijn
3 %i Het programma verwacht invoer van een decimaal getal van het type integer. De variabele moet van het type int. zijn
4 %e, %E Het programma verwacht een getal met drijvende komma (komma) in exponentiële vorm in te voeren. De variabele moet van het type float zijn.
5 %f Het programma verwacht een getal met drijvende komma (komma). De variabele moet van het type float zijn.
6 %g, %G Het programma verwacht een getal met drijvende komma (komma). De variabele moet van het type float zijn.
7 %a Het programma verwacht een getal met drijvende komma (komma). De variabele moet van het type float zijn.
8 %o Het programma verwacht een octaal getal. De variabele moet van het type int. zijn
9 %s Het programma wacht op het invoeren van een string. Een tekenreeks is een verzameling tekens tot aan het eerste aangetroffen scheidingsteken. De variabele moet van het type string zijn.
10 %x, %X Het programma wacht op een hexadecimaal getal. De variabele moet van het type int. zijn
11 %p Variabele verwacht invoer van de aanwijzer. De variabele moet van het aanwijzertype zijn.
12 %n

Schrijft naar een variabele een geheel getal gelijk aan het aantal tekens dat tot nu toe door de scanf-functie is gelezen.

13 %u Het programma leest een geheel getal zonder teken. Het type variabele moet een geheel getal zonder teken zijn.
14 %b Het programma wacht op een binair getal. De variabele moet van het type int. zijn
15 % Gescande tekenset. Het programma wacht op het invoeren van tekens.uit de beperkte pool die tussen vierkante haken is opgegeven. scanf werkt zolang er tekens uit de opgegeven set in de invoerstroom staan.
16 %% Teken "%".

Tekens in het formaat string

C++-code
C++-code

Stersymbool ()

De asterisk () is een vlag die aangeeft dat de toewijzingsbewerking moet worden onderdrukt. Direct na het "%"-teken wordt een asterisk geplaatst. Bijvoorbeeld


scanf("%d%c%d", &x, &y); // negeer teken tussen twee gehele getallen. scanf("%s%d%s", str, str2); // negeer geheel getal tussen twee strings.

Dat wil zeggen, als u de regel "45-20" in de console invoert, zal het programma het volgende doen:

  1. Variabele "x" krijgt de waarde 45.
  2. Variabele "y" krijgt de waarde 20.
  3. En het minteken (streepje) "-" wordt genegeerd dankzij "%c".

Breedte (of veldbreedte)

Dit is een geheel getal tussen het "%"-teken en de formaatspecificatie die het maximale aantal tekens aangeeft dat moet worden gelezen in de huidige leesbewerking.


scanf("%20s", str); // lees de eerste 20 tekens van de invoerstroom

Er zijn een paar belangrijke dingen om in gedachten te houden:

  1. scanf wordt beëindigd als het een scheidingsteken tegenkomt, zelfs als het geen 20 tekens telde.
  2. Als er meer dan 20 tekens worden ingevoerd, worden alleen de eerste 20 tekens naar str geschreven.

Modificatiestype (of precisie)

splash-code
splash-code

Dit zijn speciale vlaggen die het type gegevens wijzigen dat voor invoer wordt verwacht. De vlag wordt opgegeven aan de linkerkant van de typeaanduiding:

  • L of l (kleine L) Wanneer "l" wordt gebruikt met de specificaties d, i, o, u, x, vertelt de vlag het programma dat een lange int-invoer wordt verwacht. Bij gebruik van "l" met de e of f specificatie, vertelt de vlag het programma dat het een dubbele waarde mag verwachten. Het gebruik van "L" vertelt het programma dat er een lange dubbel wordt verwacht. Het gebruik van "l" met de "c" en "s" specifiers vertelt het programma dat twee-byte karakters zoals wchar_t worden verwacht. Bijvoorbeeld "%lc", "%ls", "%l[asd]".
  • h is een vlag die het korte type aangeeft.
  • hh - geeft aan dat de variabele een pointer is naar een ondertekende char of unsigned char-waarde. De vlag kan worden gebruikt met de specificaties d, i, o, u, x, n.
  • ll (twee kleine L's) - geeft aan dat de variabele een verwijzing is naar een waarde van het type ondertekend long long int of unsigned long long int. De vlag wordt gebruikt met specificaties: d, i, o, u, x, n.
  • j - geeft aan dat de variabele een verwijzing is naar het type intmax_t of uintmax_t uit het headerbestand stdint.h. Gebruikt met specificaties: d, i, o, u, x, n.
  • z - geeft aan dat de variabele een pointer is naar het size_t type, waarvan de definitie in stddef.h staat. Gebruikt met specificaties: d, i, o, u, x, n.
  • t - geeft aan dat de variabele een verwijzing is naar het ptrdiff_t-type. Definitie aandit type staat in stddef.h. Gebruikt met specificaties: d, i, o, u, x, n.

Duidelijker is dat de afbeelding met modifiers kan worden weergegeven als een tabel. Een dergelijke beschrijving van scanf C voor programmeurs zal duidelijker zijn.

Typespecificaties en modificaties
Typespecificaties en modificaties

Andere karakters

Alle tekens die in het formaat worden aangetroffen, worden weggegooid. Tegelijkertijd moet worden opgemerkt dat de aanwezigheid van spaties of scheidingstekens (nieuwe regel, spatie, tab) in de besturingsreeks kan leiden tot ander gedrag van de functie. In één versie zal scanf() lezen zonder een aantal scheidingstekens op te slaan totdat het een ander teken dan het scheidingsteken tegenkomt, en in een andere versie spelen spaties (alleen zij) geen rol en de uitdrukking "%d + %d" is gelijk aan "% d+%d".

C++ code voorbeeld
C++ code voorbeeld

Voorbeelden

Laten we enkele voorbeelden bekijken om u te helpen nadenken en beter te begrijpen hoe de functie werkt.


scanf("%3s", str); // als je de string "1d2s3d1;3" invoert in de console, wordt alleen "1d2" geschreven naar str scanf("%dminus%d", &x, &y); //mintekens tussen twee cijfers worden weggegooid scanf("%5[0-9]", str); // tekens worden in str ingevoerd totdat er 5 tekens zijn en de tekens cijfers van 0 tot 9 zijn. scanf("%lf", &d); // verwacht dubbele invoer scanf ("%hd", &x); // verwacht aantal type short scanf ("%hu", &y); // verwacht niet-ondertekend nummer short scanf ("lx", &z); // verwacht aantal type long int

VanDe onderstaande voorbeelden laten zien hoe het verwachte aantal verandert met verschillende symbolen.

scanf C - beschrijving voor beginners

Dit gedeelte is handig voor beginners. Vaak moet je niet zozeer een volledige beschrijving van scanf C bij de hand hebben als wel de details van hoe de functie werkt.

  • Deze functie is enigszins verouderd. Er zijn verschillende implementaties in bibliotheken van verschillende versies. Bijvoorbeeld de verbeterde scanf SC-functie, waarvan een beschrijving te vinden is op de microsoft-website.
  • Het aantal specificeerders in het formaat moet overeenkomen met het aantal argumenten dat aan de functie is doorgegeven.
  • Invoerstroomelementen mogen alleen worden gescheiden door scheidingstekens: spatie, tab, nieuwe regel. Komma, puntkomma, punt, etc. - deze tekens zijn geen scheidingstekens voor de scanf()-functie.
  • Als scanf een scheidingsteken tegenkomt, wordt de invoer gestopt. Als er meer dan één variabele is om te lezen, gaat scanf verder met het lezen van de volgende variabele.
  • De geringste inconsistentie in het invoergegevensformaat leidt tot onvoorspelbare resultaten van het programma. Nou, als het programma gewoon eindigt met een fout. Maar vaak blijft het programma werken en doet het het verkeerd.
  • scanf("%20s …", …); Als de invoerstroom langer is dan 20 tekens, zal scanf de eerste 20 tekens lezen en ofwel afbreken of doorgaan met het lezen van de volgende variabele, als die is opgegeven. In dit geval zal de volgende aanroep van scanf doorgaan met het lezen van de invoerstroom vanaf het punt waar het werk van de vorige aanroep van scanf is gestopt. Als bij het lezen van de eerste 20Als er een scheidingsteken wordt aangetroffen, zal scanf de volgende variabele afbreken of doorgaan met lezen, zelfs als er geen 20 tekens voor de eerste variabele zijn gelezen. In dit geval worden alle ongelezen tekens aan de volgende variabele toegevoegd.
  • Als de set gescande tekens begint met een "^", dan zal scanf de gegevens lezen totdat het een scheidingsteken of een teken uit de set tegenkomt. Bijvoorbeeld, "%[^A-E1-5]" zal gegevens uit de stream lezen totdat een van de Engelse hoofdletters van A tot E of een van de cijfers van 1 tot 5 wordt aangetroffen.
  • De scanf C-functie, zoals beschreven, retourneert een getal dat gelijk is aan het succesvolle aantal schrijfacties naar variabelen. Als scanf 3 variabelen schrijft, zal het succesresultaat van de functie het getal 3 retourneren. Als scanf geen variabelen kon schrijven, dan is het resultaat 0. En, ten slotte, als scanf om de een of andere reden helemaal niet kon starten, resultaat is EOF.
  • Als de scanf()-functie onjuist is geëindigd. Bijvoorbeeld scanf("%d", &x) - er werd een getal verwacht, maar er werden tekens ontvangen als invoer. De volgende scanf()-aanroep begint op het punt in de invoerstroom waar de vorige functieaanroep eindigde. Om dit probleem op te lossen, is het noodzakelijk om de probleemkarakters te verwijderen. Dit kan bijvoorbeeld door scanf("%s") aan te roepen. Dat wil zeggen, de functie leest een reeks tekens en gooit deze weg. Op deze lastige manier kun je doorgaan met het invoeren van de benodigde gegevens.
  • In sommige implementaties van scanf(), is "-" niet toegestaan in de gescande tekenset.
  • De specificatie "%c" leest elk teken uit de stream. Dat wil zeggen, het leest ook het scheidingsteken. Om het scheidingsteken over te slaan en het gewenste teken verder te lezen, kunt u "%1s" gebruiken.
  • Bij gebruik van de specificatie "c" is het toegestaan om de breedte "%10c" te gebruiken, maar dan moet een array van elementen van het type char als variabele worden doorgegeven aan de scanf-functie.
  • "%[a-z]" betekent "alle kleine letters van het Engelse alfabet", en "%[z-a]" betekent slechts 3 tekens: 'z', 'a', '-'. Met andere woorden, het teken "-" betekent alleen een bereik als het tussen twee tekens ligt die in de juiste volgorde staan. Als "-" aan het einde van een uitdrukking staat, aan het begin, of in de verkeerde volgorde van tekens aan weerszijden ervan, dan is het slechts een koppelteken, geen bereik.
C++-code
C++-code

Conclusie

Hiermee is de beschrijving van scanf C afgerond. Dit is een leuke handige functie voor het werken in kleine programma's en bij het gebruik van de procedurele programmeermethode. Het grootste nadeel is echter het aantal onvoorspelbare fouten dat kan optreden bij het gebruik van scanf. Daarom kunt u de beschrijving van scanf C bij het programmeren het beste voor ogen houden. In grote professionele projecten worden iostreams gebruikt, vanwege het feit dat ze hogere capaciteiten hebben, ze beter in staat zijn om fouten op te sporen en af te handelen, en ook met aanzienlijke hoeveelheden informatie werken. Er moet ook worden opgemerkt dat de beschrijving van scanf C in het Russisch beschikbaar is op veel netwerkbronnen, evenals voorbeelden ervangebruik vanwege de ouderdom van de functie. Daarom kunt u, indien nodig, altijd het antwoord vinden op de thematische forums.

Aanbevolen: