printf(3)

NAAM
printf, fprintf, dprintf, vprintf, vfprintf, vdprintf, - geformateerde uitvoer conversie

BIBLIOTHEEK
Standaard C bibliotheek (libc, -lc)

SAMENVATTING
#include <stdio.h>

int printf(const char *restrict opmaak, ...);
int fprintf(FILE *restrict stroom,
            const char *restrict opmaak, ...);
int dprintf(int fd,
            const char *restrict opmaak, ...);

int vprintf(const char *restrict opmaak, va_list ap);
int vfprintf(FILE *restrict stroom,
            const char *restrict opmaak, va_list ap);
int vdprintf(int fd,
            const char *restrict opmaak, va_list ap);

    Feature Test Macro Requirements voor glibc (zie feature_test_macros(7)):

dprintf(), vdprintf():
    Vanaf glibc 2.10:
        _POSIX_C_SOURCE >= 200809L
    Voor glibc 2.10:
        _GNU_SOURCE

BESCHRIJVING
De functies in de printf familie produceren uitvoer volgens een opmaak zoals onder beschreven. De functies printf en vprintf schrijven uitvoer naar stdout, de standaard uitvoer stroom; fprintf en vfprintf schrijven uitvoer naar de gegeven uitvoer stroom.

De functie dprintf() is hetzelfde als fprintf() behalve dat het schrijft naar een bestandsbeschrijving, fd, in plaats van naar de stdio(3) stroom.

De functies vprintf(), vfprintf(), vdprintf(), vsprintf(), vsnprintf() zijn equivalent aan de functies printf(), fprintf(), dprintf(), sprintf(), snprintf(), respectievelijk, behalve dat ze worden aangeroepen met een va_list in plaats van een variabel aantal argumenten.. Deze functies roepen de macro va_end niet aan. Omdat ze de va_arg macro gebruiken, de waarde van ap is ongedefinieerd na de aanroep. Zie stdarg(3).

Al deze functies schrijven de uitvoer bepaald door een formaat tekenreeks die specificeert hoe achtereenvolgende argumenten (of argumenten benaderd via een argument met variabele lengte faciliteiten van strdarg(3)) worden omgezet voor uitvoer.

  Vorm van de formatstring
De formatstring is een karakterstring, beginnend en eindigend in zijn initiële "shift state", als die er is. De vormstring bestaat uit nul of meer aanwijzingen: normale karakters (niet %), die onveranderd naar de uitvoer stroom worden gekopieerd; en conversie specificaties, die elk zorgen dat nul of meer opeenvolgende argumenten gepakt worden. Elke conversie specificatie wordt begonnen met het karakter %, en eindigt met een "conversie specificatie". Daar tussenin mogen (in deze volgorde) nul of meer vlaggen aanwezig zijn, een optionele minimum veldbreedte, een optionele precisie en een optionele lengte aanpasser.

De algemene syntaxis van een conversie specificatie is:

%[argument$][vlaggen][breedte][.precision][length modifier]conversion

De argumenten moeten correct overeenkomen (na type promotie) met de conversie specificatie. Standaard worden de argumenten in de gegeven volgorde gebruikt, waarbij elke '*' (zie Veldbreedte en Precisie) en elke conversie specificatie vraagt om het volgende argument (en het is een fout als een onvoldoende aantal argumenten zijn gegeven). Men kan ook expliciet opgeven welk argument genomen zal worden, op elke plaats waar een argument vereist is, door "%m$" te schrijven in plaats van '%' en "*m$" in plaats van '*', waar het decimale hele getal m de positie in de argumenten lijst van het gewenst argument bepaald, genummerd vanaf 1. Dus,

    printf("%*d", breedte, num);

en

    printf("%2$*1$d", breedte, num);

zijn gelijk. De tweede stijl laat herhaaldelijke referenties naar hetzelfde argument toe. De C99 standaard specificeert de '$' stijl niet; die komt van de Single Unix Specification. Als de '$' stijl wordt gebruikt, dan moet die gebruikt worden voor alle conversies die een argument meekrijgen en alle breedte en precisie argumenten. De stijl mag echter gemengd worden met "%%" vormen die geen argument gebruiken. Er mogen geen gaten zitten in de nummering van de argumenten die met '$'; gespecificeerd worden; bijvoorbeeld, als argumenten 1 en 3 gespecificeerd zijn, dan moet ook argument 2 ergens in de formatstring gespecificeerd zijn.

Voor sommige numerieke conversies wordt een breuk-karakter ("decimale komma") of duizendtallen-scheidingskarakter gebruikt. Het feitelijk gebruikte karakter hangt af van het LC_NUMERIC deel van de taaldefinitie (zie setlocale(3)). De POSIX taaldefinitie gebruikt '.' als breuk-karakter, en heeft geen duizendtallen-scheidingskarakter. Dus:

    printf("%'.2f", 1234567.89);

resulteert in "1234567.89" in de POSIX localiteit, in "1234567,89" in de nl_NL localiteit, en in "1.234.567,89" in de da_DK localiteit.

  De vlag karakters
Het karakter % wordt gevolgd door nul of meer van de volgende vlaggen:

#   De waarde moet omgezet worden naar een "alternatieve vorm". Voor o conversies betekent dat dat het eerste karakter van de uitvoerstring nul wordt (door een 0 ervoor te zetten als het niet al nul was). Voor x en X conversies, heeft een niet-nul resultaat de string "0x" (of "0X" voor X conversies) ervoor gezet. Voor a, A, e, E, f, F, g en G omzettingen zal het resultaat altijd een decimale punt hebben, zelfs als er geen cijfers op volgen (gewoonlijk verschijnt een decimale punt alleen in de resultaten van deze conversies als er een cijfer op volgt). Voor g en G conversies worden nakomende nullen niet verwijderd van het resultaat, wat anders wel het geval zou zijn. Voor m, als errno een geldige foutcode bevat, wordt de uitvoer van strerrorname_np(errno) getoond; anders wordt de waarde zoals opgeslagen in errno getoond als een decimaal getal. For other conversions, the result is undefined. Voor andere omzettingen is het resultaat onbepaald.

0   De waarde moet met nullen aangevuld worden. Voor d, i, o, u, x, X, a, A, e, E, f, F, g en G omzettingen wordt de geconverteerde waarde links met nullen aangevuld, in plaats van met witruimte. Als de 0 and - vlaggen allebei gezet zijn, dan wordt de 0 vlag genegeerd. Als een precisie gegeven is met een numerieke omzetting (d, i, o, u, x en X) dan wordt de 0 vlag genegeerd. Voor andere conversies is het gedrag onbepaald.

-   De geconverteerde waarde wordt links uitgelijnd op de veldgrens. (Normaal wordt rechts uitgelijnd.) De geconverteerde waarde wordt aan de rechterkant aangevuld met witruimte, in plaats van linksmet witruimte of nullen. Een - heeft voorrang op een 0 als beide gegeven zijn.

' ' (een spatie) Een spatie gaat vooraf aan een positief getal (of lege string) dat gegeven wordt na een conversie met teken.

+   Een teken (+ of -) wordt altijd geplaatst voor een getal dat door een conversie met teken gegeven wordt. Normaal gesproken wordt een teken alleen gebruikt voor negatieve getallen. Een + heeft voorrang op een spatie als beiden gebruikt worden.

De vijf vlag tekens hier boven zijn gedefinieerd in de C99 standaard. POSIX specificeert nog een vlag teken.

'   Voor de decimale conversie (i, d, u, f, F, g, G) wordt de uitvoer gegroepeerd met het duizendtal groepeer teken als een niet-monutaire hoeveelheid. Dit kan misleidend zijn, want geldt niet noodzakelijk voor elke duizend. Bijvoorbeeld groepeert Karbi ("mjw_IN") zijn cijfers één keer in 3 en vervolgens in groepjes van 2. Vergelijk eens locale(7) grouping en thousands_sep, in tegenstelling tot mon_grouping/mon_thousands_sep en strfmon(3). Dit is een no-op in de standaard "C" locale.L

glibc 2.2 voegde nog een vlag teken toe.

I   Voor decimale integer conversie (i, d, u) gebruikt de uitvoer de alternatieve uitvoer cijfers van het taalgebied, als die er is. Bijvoorbeeld, vanaf glibc 2.2.3 resulteert dit in Arabisch-Indische cijfers in het Perzische ("fa_IR") taalgebied.

  Veldbreedte
Een optionele decimaal cijfer reeks (met het eerste cijfer niet-nul) dat een minimale veldbreedte opgeeft. Als de geconverteerde waarde minder tekens dan de veldbreedte heeft, dan wordt die links aangevuld met spaties (of rechts, als de links-uitlijnen vlag gegeven is). In plaats van een decimale cijfer reeks kan men ook "*" of "*m$" schrijven (voor een decimaal geheel getal m) op aan te geven dat de veldbreedte gegeven is in het volgende argument, of in het m-de argument, respectievelijk, dat van type int moet zijn. Een negatieve veldbreedte wordt gelezen als een '-' vlag, gevolgd door een positieve veldbreedte. In geen geval leidt een niet-bestaande of kleine veldbreedte tot afkappen van een veld; als het resultaat van een conversie breder is dan de veldbreedte, dan wordt het veld breder gemaakt om het resultaat te kunnen bevatten.

  Precisie
Een optionele precisie, in de vorm van een punt ('.') gevolgd door een optionele decimale cijfer reeks. In plaats van een decimale cijfer reeks kan men "*" of "*m$" schrijven (waarbij m een decimaal geheel getal is) om aan te geven dat de precisie gegeven is in respectievelijk het volgende argument of het m-de argument, wat van type int moet zijn. Als de precisie gegeven is als slechts '.', of als de precisie negatief is, dan wordt dit gelezen als nul. Dit bepaalt het minimum aantal cijfers dat voor d, i, o, u, x en X conversies moet komen, het aantal cijfers dat na het radix karakter moet komen voor a, A, e, E, f en F conversies, het maximum aantal significante cijfers voor g en G conversies, of het maximum aantal karakters dat afgedrukt moet worden van een string voor s en S conversies.

  Lengteaanpasser
Met "integer conversie" wordt hier d, i, o, u, x of X conversie bedoeld.

hh  Een volgende integer conversie correspondeert met een signed char of unsigned char argument, of een volgende n conversie correspondeert met een pointer naar een signed char argument.

h   Een volgende integer conversie correspondeert met een short of unsigned short argument, of een volgende n conversie correspondeert met een pointer naar een short argument.

l   (ell) Een volgende integer conversie correspondeert met een long of unsigned long argument, of een volgende n conversie correspondeert met een pointer naar een long argument, of een volgende c conversie correspondeert met een wint_t argument, of een volgende s conversie correspondeert met een pointer naar een wchar_t argument. Bij een volgende a, A, e, E, f, F, g, of G conversie, wordt de lengte aanpasser genegeerd (C99; niet in SUSv2).

ll  (el-el). Een volgende integer conversie correspondeert met een long longof unsigned long long argument, of een volgende n conversie correspondeert met een pointer naar een long long argument.

q   Een synoniem for ll. Dit is een niet-standaard uitbreiding, afgeleid van BSD; vermijd het gebruik hiervan in nieuwe code.

L   Een volgende a, A, e, E, f, F, g of G conversie correspondeert met een long double argument. (%LF wordt toegestaan door C99, maar niet door SUSv2.)

j   Een volgende integer conversie correspondeert met een intmax_t of uintmax_t argument, of een volgende n conversie komt overeen met een wijzer naar een intmax_t argument.

wN  A following integer conversion corresponds to an integer of a width of N bits (C23).

z   Een volgende integer conversie correspondeert met een size_t of ssize_t argument, of een volgende n conversie komt overeen met een wijzen naar een size_t argument.

Z   Een niet-standaard synoniem voor z die voor af ging aan het verschijnen van z. Gebruik dit niet in nieuwe code.

t   Een volgende integer conversie correspondeert met een ptrdiff_t argument, of een volgende n conversie overeenkomende met een wijzer naar een ptrdiff_t argument.

SUSv3 specificeert alles zoals hierboven, behalve voor die extra toetsen die expliciet gegeven zijn als zijnde niet-standaard uitbreidingen. SUSv2 specificeerde alleen de lengte van de extra toetsen h (in hd, hi, ho, hx, hX, hn) en l (in ld, li, lo, lx, lX, ln, lc, ls) en L (in Le, LE, Lf, Lg, LG).

Zijnde een niet-standaard uitbreiding behandelen de GNU implementaties ll en L als synoniemen, daarom kan men, bijvoorbeeld ll schrijven (als een synoniem voor de aan de standaard voldoende Lg) en Ld (als synoniem voor de aan de standaard voldoende lld. Dit gebruik is niet overdraagbaar.

  De conversie specificator
Een karakter dat aangeeft welk type van conversie moet worden toegepast. De conversie specificatoren en hun betekenis zijn:

d, i
    Het int argument wordt geconverteerd naar decimale notatie met teken. De precisie, als die er is, geeft het minimum aantal cijfers dat moet voorkomen; als de geconverteerde waarde minder cijfers nodig heeft, dan wordt het links met nullen aangevuld. De standaard precisie is 1. Als 0 wordt afgedrukt met een expliciete precisie 0, dan is de uitvoer leeg.

o, u, x, X
    Het unsigned int argument wordt geconverteerd naar octaal zonder teken. "" (u), of hexadecimaal zonder teken "" (x en X) notatie. De letters abcdef worden gebruikt voor x conversies; de letters ABCDEF worden gebruikt voor X conversies. De precisie, als die er is, geeft het minimum aantal cijfers dat moet verschijnen; als de geconverteerde waarde minder cijfers nodig heeft, dan wordt deze links met nullen aangevuld. De standaard precisie is 1. Als 0 wordt afgedrukt met een expliciete precisie 0, dan is de uitvoer leeg.

e, E
    Het double argument wordt afgerond en geconverteerd in de stijl [-]d.ddde±dd waar er één cijfer voor het decimale-punt karakter is, en het aantal cijfers erna gelijk is aan de precisie; als de precisie ontbreekt, dan wordt die als 6 genomen; als de precisie nul is, dan verschijnt er geen decimale-punt karakter. Een E conversie gebruikt de letter E (in plaats van e) om de exponent aan te geven. De exponent bevat altijd ten minste twee cijfers; als de waarde nul is, dan is de exponent 00.

f, F
    Het double argument wordt afgerond en geconverteerd naar decimale notatie in de stijl [-]ddd.ddd, waar het aantal cijfers na het decimale-punt karakter gelijk is aan de precisie specificatie. Als de precisie ontbreekt, dan wordt die als 6 genomen; als de precisie expliciet nul is, dan verschijnt er geen decimale-punt karakter. Als er een decimale punt verschijnt, dan komt er tenminste één cijfer vóór.

    (SUSv2 kent geen F en zegt dat tekenreeks representaties voor oneindig en NaN beschikbaar zouden kunnen komen. SYSv3 voegde een specificatie voor F toe. De C99 standaard specificeert "[-]inf" of "[-]infinity" voor oneindig, en een tekenreeks, beginnend met "nan" voor NaN, in het geval van f conversie, en "[-]INF" of "[-]INFINITY" of "NAN*" in het geval van F conversie.)

g, G
    Het double argument wordt geconverteerd in stijl f of e (of F of E voor G conversies). De precisie specificeert het aantal significante cijfers. Als de precisie ontbreekt, dat worden 6 cijfers gegeven; als de precisie nul is, dan wordt het behandeld als 1. Stijl e wordt gebruikt als de exponent van de conversie minder dan -4 is of groter dan of gelijk aan de precisie. Nullen aan het eind worden verwijderd van het fractionele deel van het resultaat; een decimale punt verschijnt alleen als die gevolgd wordt door ten minste één cijfer.

a, A
    (C99; niet in SUSv2) Voor a conversie, wordt het double argument geconverteerd naar hexadecimale notatie (gebruikmakend van de letters abcdef) in de stijl [-]0xh.hhhhp±; voor A conversie wordt de prefix 0X, de letters ABCDEF, en de exponent scheider P gebruikt. Er is één hexadecimaal cijfer voor de decimale punt, en het aantal cijfers erna is gelijk aan de precisie. De standaard precisie is genoeg voor een exacte representatie van de waarde als een exacte binaire representatie bestaat; anderzijds is die groot genoeg om waarden van type double te kunnen onderscheiden. Het cijfer voor de decimale punt is onbepaald voor niet-genormaliseerde getallen, en niet-nul maar verder onbepaald voor genormaliseerde getallen. De exponent, d, de toepasselijke exponent van 2 uitgedrukt als een decimaal geheel getal; het bevat altijd op zijn minste een cijfer; als de waarde nul is, dan is de exponent 0.

c   Als er geen l aanpasser is, dan wordt het int argument geconverteerd naar een unsigned char; het resulterende teken wordt dan geschreven. Als er een l aanpasser is, dan wordt het wint_t (breed karakter) argument geconverteerd naar een multibyte rij door een aanroep van de wcrtomb(3) functie, met een conversie status in de initiële status; de resulterende multibyte tekenreeks wordt dan geschreven.

s   Als er geen l aanpassing is: Het const char * argument wordt aangenomen een wijzer te zijn naar een rij van character type (wijzer naar een tekenreeks). Tekens van de rij worden geschreven tot aan (en zonder) een afsluitend NULL teken ('\0'); als een precisie gegeven is, dan worden er niet meer dan het aangegeven aantal geschreven. Als een precisie gegeven is, dan hoeft er geen NULL teken te zijn; als de precisie niet gegeven is, of groter is dan de lengte van de rij, dan moet de rij een afsluitend NULL teken bevatten.

    Als er een l aanpasser is: Van het const wchar_t * wordt aangenomen dat het een wijzer naar een rij van brede karakters is. Brede karakters van de rij worden geconverteerd naar multibyte karakters (ieder door een aanroep van de wcrtomb functie, met een conversie status beginnend in de initiële status vóór het eerste brede teken), tot aan en met een afsluitend null breed karakter. De resulterende multibyte tekens worden geschreven tot aan (en zonder) de afsluitende null byte. Als een precisie gegeven is, dan worden niet meer bytes dan het aangegeven aantal geschreven; echter, er worden geen gedeeltelijke multibyte karakters geschreven. Merk op dat de precisie het aantal geschreven bytes bepaald, niet het aantal brede karakters of screen positions. De rij moet een afsluitend null breed teken bevatten, tenzij een precisie gegeven is, en de rij zo kort is dat het aantal geschreven bytes er over heen gaat voordat het einde van de rij bereikt is.

C   (Niet in C99, wel in SUSv2, SUSv3 en SUSv4.) Synoniem voor lc. Niet gebruiken.

S   (Niet in C99 of C11, wel in SUSv2, SUSv3 en SUSv4.) Synoniem voor ls. Niet gebruiken.

p   Het void * pointer argument is afgedrukt in hexadecimaal (net als bij %#x of %#lx).

n   Het aantal tot nog toe geschreven tekens wordt opgeslagen in het gehele getal aanwezen door het overeenkomende wijzer argument. Dat argument zal een int zijn, of een variant waarvan de grootte overeenkomt met het (optioneel) opgegeven gehele getal. Het argument wordt niet geconverteerd. (Deze specificatie wordt niet ondersteund door de bionic C bibliotheek.) Het gedrag is ongedefinieerd als de conversie specificatie een vlag, een veld breedte of een precisie bevat.

m   (glibc uitbreiding; ondersteund door uClibc en musl. en op Android vanaf API niveau 29.) Toon uitvoer van strerror(errno) (of strerrorname_np(errno) in de alternatieve vorm). Geen argument is vereist.

%   Een '%' wordt geschreven. Er wordt geen argument geconverteerd. De volledige conversie specificatie is '%%'.

EIND WAARDE
Bij succesvolle terugkeer, retourneert deze functie het aantal tekens dat afgedrukt werd (exclusief het NULL byte gebruikt aan het einde van de tekenreeks).

Bij falen wordt -1 teruggegeven en wordt errno overeenkomstig gezet.

FOUTEN
Zie write(2) en putwc(3). Bovendien kan de volgende fout optreden:

EOVERFLOW
    De terug gegeven waarde is groter dan INT_MAX.

De dprintf() functie kan nog falen als:

EBADF
    Het fb argument is geen geldige bestandsindicator.

ATTRIBUTEN
Voor een uitleg van de termen zoals gebruikt in deze sectie, zie attributen(7).
Interface | Attribuut | Waarde
printf(), fprintf(), vprintf(), vfprintf() | Thread veilig | MT-Safe taalgebied

STANDAARDEN

fprintf()
printf()
vprintf()
vfprintf()
    C11, POSIX.1-2008.

dprintf()
vdprintf()
    GNU, POSIX.1-2008.

HISTORIE

fprintf()
printf()
vprintf()
vfprintf()
    C89, POSIX.1-2001.

dprintf()
vdprintf()
    GNU, POSIX.1-2008.

Issue 4 van de X/Open Portability Guide (SUSv1, 1994) voegt ' toe.

glibc 2.1 voegt lengte aanpassingen hh, j, t, en z en conversie tekens a en A toe.

glibc 2.2 voegt het conversie teken F met C99 semantiek, en het vlag teken I toe.

glibc 2.35 geeft een betekenis aan de alternatieve vorm (#) of de m conversie aanpasser, dat is %#m.

BUGS
Code zoals printf(foo); duid vaak op een bug, omdat foo een % teken kan bevatten. Als foo afkomstig is van een niet vertrouwde gebruiker invoer kan het %n bevatten, er voor zorgende dat de printf() aanroep naar geheugen schrijft daarbij een veiligheid gat creëert.

VOORBEELDEN
Om Pi af te drukken in vijf decimalen:

    #include <math.h>
    #include <stdio.h>
    fprintf(stdout, "pi = %.5f\n", 4 * atan(1.0));

Om een datum en tijd in de vorm van "Sunday, July 3, 10:02" af te drukken, waar weekday en month wijzers naar tekenreeksen zijn:

    #include <stdio.h>
    fprintf(stdout, "%s, %s %d, %.2d:%.2d]rs]n",
            weekday, month, day, hour, min);

In veel landen wordt de dag-maand-jaar volgorde gebruikt. Daarom moet een geïnternationaliseerde versie de argumenten af kunnen drukken in een volgorde die gespecificeerd wordt door het format:

    #include <stdio.h>
    fprintf(stdout, format,
            weekday, month, day, hour, min);

waar format afhangt van taalgebied, en de argumenten zou kunnen permuteren. Met de waarde

    "%1$s, %3$d. %2$s, %4$d:%5$.2d\n"

zou men "Zondag, 3 juli, 10:02" kunnen verkrijgen.

ZIE OOK
printf(1), asprintf(3), puts(3), scanf(3), setlocale(3), snprintf(3), strfromd(3), wcrtomb(3), wprintf(3), locale(5)

VERTALING
De Nederlandse vertaling van deze handleiding is geschreven door Jos Boersema <joshb@xs4all.nl>, Joost van Baal <joostv-manpages-nl-2398@mdcc.cx>, Mario Blättermann <mario.blaettermann@gmail.com> en Luc Castermans <luc.castermans@gmail.com>

Deze vertaling is vrije documentatie; lees de GNU General Public License Version 3 (https://www.gnu.org/licenses/gpl-3.0.html) of later over de Copyright-voorwaarden. Er is geen AANSPRAKELIJKHEID.

Indien U fouten in de vertaling van deze handleiding zou vinden, stuur een e-mail naar debian-l10n-dutch@lists.debian.org.