formatting i o printf
Deze tutorial bespreekt het gebruik en voorbeelden van functies zoals printf, sprintf, scanf die worden gebruikt voor het formatteren van invoer / uitvoer in C ++:
In onze vorige C ++ -lessen hebben we gezien dat we invoer-uitvoerbewerkingen in C ++ kunnen uitvoeren met cin / cout.
Naast het gebruik van deze constructies kunnen we ook gebruik maken van de C-bibliotheek. Met behulp van C Standard Input and Output Library (cstdio, C ++ equivalent voor stdio.h header in C-taal), voeren we I / O-bewerkingen uit met behulp van 'streams' die werken met fysieke apparaten zoals toetsenborden (standaardinvoer), printers, terminals (standaarduitvoer ) of andere bestandstypen die door het besturingssysteem worden ondersteund.
Bekijk hier de diepgaande C ++ trainingshandleidingen.
Streams zijn niets anders dan een abstracte entiteit die wordt gebruikt om op een uniforme manier met fysieke apparaten te communiceren. Alle streams hebben vergelijkbare kenmerken en zijn onafhankelijk van de fysieke media-apparaten.
In onze volgende onderwerpen in deze tutorial zullen we in detail leren over enkele functies, namelijk printf, sprint en scanf.
Wat je leert:
- C ++ printf
- C ++ sprintf
- C ++ scanf
- scanf / printf Vs. cin / cout In C ++
- Veel Gestelde Vragen
- Gevolgtrekking
C ++ printf
De printf-functie in C ++ wordt gebruikt om de uitvoer te schrijven die is opgemaakt naar stdout.
Functieprototype:
int printf (const char * formaat, ...);
Parameters:
format => Een pointer naar een met null beëindigde tekenreeks die naar de bestandsstroom is geschreven. Het bestaat uit tekens samen met een optionele indelingsspecificatie die begint met%. De formaatspecificatie wordt vervangen door de juiste waarden die volgen op de opmaakreeks.
Andere aanvullende argumenten die de gegevens specificeren die moeten worden afgedrukt in de volgorde waarin de indeling is opgegeven.
Winstwaarde:
Java-interviewprogramma's en antwoorden voor ervaren
Succes => printf geeft het aantal geretourneerde tekens terug.
Mislukking => Negatieve waarde
Omschrijving:
De printf-functie is gedefinieerd in header. De printf-functies schrijven de string waarnaar wordt verwezen door de 'format' -wijzer naar de standaarduitvoer stdout. De format string kan format specifiers bevatten die dan vervangen worden door de variabelen die als aanvullende argumenten aan de printf functie worden doorgegeven (na format string).
Formaatspecificatie gebruikt in printf () functie
Een algemene vorm van formaatspecificatie is
Hieronder volgt een beschrijving van elk van de onderdelen van de formaatspecificatie:
- % teken: Dit is een leidend% -teken
- Vlaggen: Ze kunnen de volgende waarden hebben:
- -: Links rechtvaardigt het resultaat binnen het veld. Standaard rechts uitgelijnd.
- +: Het teken van het resultaat dat aan het begin van de waarde is gekoppeld, inclusief positieve resultaten.
- Spatie: als er geen teken is, wordt er een spatie toegevoegd aan het begin van het resultaat.
- #: Specificeer een alternatieve vorm van conversie.
- 0: gebruikt voor gehele getallen en getallen met drijvende komma. Werk als voorloopnullen als er geen spatie is.
- Breedte: Specificeert de minimale veldbreedte in de vorm van een * of een geheel getal. Dit is optioneel.
- Precisie: Specificeert precisie met een ‘.’ Gevolgd door een * of een geheel getal of niets. Dit is ook optioneel.
- Lengte: Het optionele argument dat de grootte van het argument heeft opgegeven.
- Specificatie: Dit is een specificatie voor het conversieformaat.
Verschillende indelingsspecificaties die in C ++ worden gebruikt, zijn als volgt:
Niet doen | Specifier | Omschrijving |
---|---|---|
7 | u | Converteert een geheel getal zonder teken naar een decimale weergave. |
1 | | Drukt een% af. |
twee | c | Drukt een enkel teken af. |
3 | s | Drukt een string af. |
4 | d / i | Converteert een geheel getal met teken naar een decimale weergave. |
5 | of | Converteert een geheel getal zonder teken naar een octale weergave. |
6 | x / X | Converteert een geheel getal zonder teken naar een hexadecimale weergave. |
8 | f / F | Converteert een getal met een drijvende komma naar een decimale weergave. |
9 | en / E | Converteert een getal met een drijvende komma naar een decimale exponentnotatie. |
10 | a / A | Converteert een drijvende-kommagetal naar een hexadecimale exponent. |
elf | g / G | Converteert drijvende-kommagetal naar decimale of decimale exponentnotatie. |
12 | n | Het aantal tekens dat tot nu toe is geschreven door deze functieaanroep. |
13 | p | Een aanwijzer die wijst naar door de implementatie gedefinieerde tekenreeks. |
Hieronder is een compleet C ++ programmeervoorbeeld gegeven dat de printf-functie demonstreert die hierboven is besproken.
C ++ printf Voorbeeld
Uitgang:
Het bovenstaande programma gebruikt verschillende aanroepen van de printf-functie en we merken op dat elke aanroep van printf verschillende formaatspecificaties gebruikt die we hierboven hebben besproken. De formaatspecificatie% .3f geeft een zwevende waarde aan met maximaal 3 decimalen. De rest van de printf-aanroepen geven de teken-, decimale, octale en hexadecimale waarden weer.
C ++ sprintf
Sprintf-functie in C ++ vergelijkbaar met printf-functie, behalve met één verschil. In plaats van de uitvoer naar de standaarduitvoer stdout te schrijven, schrijft sprintf de uitvoer naar een tekenreeksbuffer.
Functieprototype:
int sprintf (char * buffer, const char * format, ...)
Parameters:
buffer => Pointer naar een stringbuffer waarnaar het resultaat moet worden geschreven.
Formaat => Pointer naar een tekenreeks met een null-einde die naar de bestandsstroom wordt geschreven.
Opmerking: de opmaakreeks die in de sprintf-functie wordt gebruikt, is dezelfde als die besproken als onderdeel van de functiebeschrijving printf.
Andere aanvullende argumenten die de gegevens specificeren die moeten worden afgedrukt in de volgorde waarin de indeling is opgegeven.
Winstwaarde:
success => Retourneert het aantal tekens dat naar de voldoende grote buffer is geschreven, exclusief het afsluitende null-teken.
Mislukking => Er wordt een negatieve waarde geretourneerd.
Omschrijving:
Sprintf-functie is gedefinieerd in de header. De sprintf-functie wordt gebruikt om een tekenreeks naar de tekenreeksbuffer te schrijven. De tekenreeksindeling kan indelingsspecificaties bevatten die beginnen met% die worden vervangen door de waarden van variabelen die als aanvullende argumenten aan de sprintf () -functie worden doorgegeven.
Laten we een voorbeeld van een C ++ -programma bekijken dat het gebruik van de sprintf-functie laat zien.
sprintf Voorbeeld
Uitgang:
In het bovenstaande voorbeeld schrijven we eerst een opgemaakte string naar een karakterbuffer mybuf met behulp van de sprintf-functie. Vervolgens tonen we de string naar stdout met cout. Ten slotte geven we het aantal tekens weer dat naar de mybuf-buffer is geschreven.
C ++ scanf
De scanf-functie in C ++ leest de invoergegevens uit de standaardinvoer stdin.
Functieprototype:
int scanf (const char * format, ...)
Parameters:
format => Pointer naar een string met een null-einde die definieert hoe de invoer moet worden gelezen. Deze opmaakreeks bestaat uit opmaakspecificaties.
Extra argumenten die gegevensinvoer ontvangen. Deze aanvullende argumenten zijn in volgorde volgens de formaatspecificatie.
Winstwaarde:
success => Retourneert een aantal ingelezen tekens.
matchingFailure => Geeft als resultaat nul als het matchen mislukt voordat het eerste ontvangende argument is toegewezen.
input Failure => Retourneert EOF als er een invoerfout optreedt voordat het eerste ontvangende argument is toegewezen.
Omschrijving:
Scanf () functie is gedefinieerd in de header. Deze functie leest de gegevens van stdin en slaat deze op in de opgegeven variabelen.
Formaatspecificatie gebruikt in scanf () functie
Het algemene formaat voor de tekenreeks van de functie scanf () is:
De formaatspecificatie heeft dus de volgende onderdelen:
- Niet-witruimte-teken: Dit zijn de tekens behalve% die één identiek teken uit de invoerstroom verbruiken.
- Witruimte-teken: Alle opeenvolgende witruimtetekens worden beschouwd als één witruimteteken. Hetzelfde geldt ook voor ontsnappingsreeksen.
- Conversiespecificatie: Het heeft het volgende formaat:
- Teken dat het begin aangeeft.
- Toewijzing onderdrukkend karakter genoemd. Indien aanwezig, wijst de scanf het resultaat niet toe aan ontvangstparameters. Deze parameter is optioneel.
- Veld breedte: Optionele parameter (een positief geheel getal) die een maximale veldbreedte aangeeft.
- Lengte: Specificeert de grootte van het ontvangen van een argument.
Conversieformaatspecificatie kan als volgt zijn:
Niet doen | Formaatspecificatie | Omschrijving |
---|---|---|
7 | x / X | Komt overeen met een niet-ondertekend hexadecimaal geheel getal. |
1 | | Komt overeen met letterlijk%. |
twee | c | Komt overeen met één teken of meerdere tekens tot de breedte. |
3 | s | Komt overeen met de reeks van niet-witruimte-tekens tot de opgegeven breedte of eerste witruimte. |
4 | d | Komt overeen met decimaal. |
5 | ik | Komt overeen met geheel getal. |
6 | of | Komt overeen met een octaal geheel getal zonder teken. |
8 | u | Komt overeen met een ongetekend decimaal geheel getal. |
9 | a / A, e / E, f / F, g / G | Komt overeen met drijvende-kommagetal. |
10 | (set) | Komt overeen met een niet-.empty reeks tekens uit de opgegeven set. Indien voorafgegaan door ^, komen karakters die niet in de set zitten overeen. |
12 | n | Retourneert het aantal tot nu toe gelezen tekens. |
13 | p | Aanwijzer naar implementatie-specifieke tekenreeks. |
Vervolgens zullen we een voorbeeldprogramma implementeren om het gebruik van de scanf-functie in C ++ te demonstreren
scanf Voorbeeld
Uitgang:
In het bovenstaande programma lezen we twee invoerreeksen en een hexadecimaal getal. Vervolgens combineren we de twee strings en geven we de resulterende string weer. Het nummer wordt geconverteerd naar decimalen en weergegeven.
scanf / printf Vs. cin / cout In C ++
scanf / printf | cin / kosten |
---|---|
Standaard input-output in C-taal. | Standaard input-output in C ++ taal. |
Gedefinieerd in 'stdio.h'. | Gedefinieerd in 'iostream'. |
scanf en printf zijn een functie die wordt gebruikt voor I / O. | cin en cout zijn stream-objecten. |
De format string wordt gebruikt voor het formatteren van de input en output. | Operatoren >> en<< are overloaded and used along with cin and cout respectively. Er wordt geen opmaakreeks gebruikt. |
We specificeren het type gegevens met behulp van placeholder. | U hoeft het gegevenstype niet op te geven. |
Veel Gestelde Vragen
Vraag 1) Kun je printf gebruiken in C ++?
Antwoord: Ja. Printf kan worden gebruikt in C ++. Om deze functie in een C ++ -programma te gebruiken, moeten we de koptekst in het programma opnemen.
Vraag 2) In welke taal wordt printf gebruikt?
Antwoord: Printf is de standaard uitvoerfunctie in C-taal. Het kan ook worden gebruikt in C ++ -taal door de koptekst op te nemen in het C ++ -programma.
V # 3) Wat is% d in C-programmering?
Antwoord: % d waarde in printf functie verwijst naar een geheel getal.
V # 4) Waarom wordt & gebruikt in Scanf?
Antwoord: & operator wordt gebruikt om toegang te krijgen tot de geheugenlocatie. Het is een afkorting om een pointer door te geven aan de variabele in plaats van deze expliciet door te geven.
V # 5) Wat is het verschil tussen printf () en sprintf ()?
Antwoord: Beide functies printf () en sprintf () zijn hetzelfde, op één verschil na. Terwijl printf () de uitvoer naar stdout (standaarduitvoer) schrijft, schrijft de sprintf de uitvoer naar een tekenreeksbuffer.
V # 6) Wordt Sprintf null beëindigd?
Antwoord: sprintf retourneert het aantal tekens dat is opgeslagen in de tekenreeksarray, exclusief het null-terminatieteken.
Q # 7) Waarom is sprintf onveilig?
Antwoord: De Sprintf-functie controleert de lengte van de bestemmingsbuffer niet. Dus als de lengte van de format string te lang is, kan de functie de overflow van de bestemmingsbuffer veroorzaken. Dit kan leiden tot applicatie-instabiliteit en beveiligingsproblemen, waardoor de sprintf-functie onveilig wordt.
Gevolgtrekking
In deze zelfstudie hebben we de invoer-uitvoerfuncties van de C-bibliotheek geleerd - printf, sprintf en scanf die kunnen worden gebruikt in C ++ door de header op te nemen die het equivalent is voor de C-header.
Zoals reeds besproken, gebruiken de invoer-uitvoerfuncties formaatspecificaties en plaatshouders en moeten we de gegevenstypen van variabelen specificeren waarin gegevens worden gelezen of geschreven.
In tegenstelling hiermee gebruiken de streaming-objecten die worden gebruikt in C ++ - cin en cout geen indelingsspecificaties of tijdelijke aanduidingen. Ze gebruiken overbelaste >> en<< operators to read in and write the data.
Bekijk hier de perfecte C ++ trainingsgids.