printf(3)

NAAM
printf, fprintf, dprintf, sprintf, snprintf, vprintf, vfprintf, vdprintf, vsprintf, vsnprintf - geformateerde uitvoer conversie

BIBLIOTHEEK
Standard C bibliotheek (libc, -lc)

SAMENVATTING
#include <stdio.h>

int printf(const char *restrict format, ...);
int fprintf(FILE *restrict stream,
            const char *restrict format, ...);
int dprintf(int fd,
            const char *restrict format, ...);
int sprintf(char *restrict str,
            const char *restrict format, ...);
int snprintf(size_t size;
            char str[restrict size], size_t size,
            const char *restrict format, ...);

int vprintf(const char *restrict format, va_list ap);
int vfprintf(FILE *restrict stream,
            const char *restrict format, va_list ap);
int vdprintf(int fd,
            const char *restrict format, va_list ap);
int vsprintf(char *restrict str,
            const char *restrict format, va_list ap);
int vsnprintf(size_t size;
            char str[restrict size], size_t size,
            const char *restrict format, va_list ap);

    Feature Test Macro´s eisen in glibc (zie feature_test_macros(7)):

snprintf(), vsnprintf():
    _XOPEN_SOURCE >= 500 || _ISOC99_SOURCE
        || /* glibc <= 2.19: */ _BSD_SOURCE

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; sprintf, snprintf, vsprintf en vsnprintf schrijven naar de karakter string str.

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 snprintf() en vsnprintf() schrijven maximaal size bytes (inclusief het afsluitende null byte ('\0') naar str.

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.

C99 en POSIX.1-2001 specificeren dat de resultaten ongedefinieerd zijn als de aanroep van sprintf(), snprintf(), vsprintf(), of vsnprintf() ervoor zou zorgen dat er gekopieerd moet worden tussen overlappende objecten (b.v., als de uitvoer tekenreeks tabel en een van de gegeven invoer argumenten wijzen naar dezelfde buffer). Zie OPMERKINGEN.

  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.

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 extension; supported by uClibc and musl, and on Android from API level 29.) Print output of strerror(errno) (or strerrorname_np(errno) in the alternate form). No argument is required.

%   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).

De functies snprintf() en vsnprintf() schrijven niet meer dan size bytes (inclusief het afsluitende NULL byte ('\0')). Als de uitvoer werd afgekapt vanwege deze limiet, dan is de teruggegeven waarde gelijk aan het aantal tekens (exclusief het afsluitende NULL byte) dat zou zijn geschreven naar de finale tekenreeks als er genoeg plaats zou zijn geweest. Dus, een terugkeer waarde van size of meer betekent dat de uitvoer werd afgekapt. (Zie hieronder bij OPMERKINGEN.)

On error, a negative value is returned, and errno is set to indicate the error.

FOUTEN
See write(2) and putwc(3). In addition, the following error may occur:

EOVERFLOW
    The value to be returned is greater than INT_MAX.

The dprintf() function may fail additionally if:

EBADF
    The fd argument is not a valid file descriptor.

ATTRIBUTEN
Voor een uitleg van de termen in deze sectie, zie attributes(7).
Interface | Attribuut | Waarde
printf(), fprintf(), sprintf(), snprintf(), vprintf(), vfprintf(), vsprintf(), vsnprintf() | Thread veiligheid | MT-Safe taalgebied

VOLDOET AAN

fprintf()
printf()
sprintf()
vprintf()
vfprintf()
vsprintf()
snprintf()
vsnprintf()
    C11, POSIX.1-2008.

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

GESCHIEDENIS

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

snprintf()
vsnprintf()
    SUSv2, C99, POSIX.1-2001.

    Betreffende de uitvoer waarde van snprintf(), zijn SUSv2 en C99 tegengesteld:als snprintf() werd aangeroepen met size=0 dan bepaalt SUSv2 een ongedefinieerde uitvoer waarde kleiner dan 1, terwijl C99 toe staat str NULL te zijn in dit geval, en geeft een uitvoer waarde terug (zoals altijd) als het aantal tekens dat zou zijn geschreven indien de uitvoer tekenreeks groot genoeg zou zijn geweest. POSIX.1-2001 en later pasten hun specificatie van snprintf() aan op C99.

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.

VOORBEHOUD
Sommige programma´s vertrouwen onvoorzichtig op code zoals de volgende

    sprintf(buf, "%s nog wat tekst", buf);

om tekst aan buf toe te voegen. Hoewel de standaard expliciet zegt dat de resultaten ongedefinieerd zijn als bron een bestemming buffers overlappen bij het aanroepen van sprintf(), snprintf(), vsprintf(), en vsnprintf(). Afhankelijk van de gebruikte versie van gcc(1), en de toegepaste compiler opties, zullen aanroepen als die hierboven niet het verwachtte resultaat opleveren.

De glibc implementatie van de functies snprintf() en vsnprintf() voldoen aan de C99 standaard, dat betekent, gedraagt zich zoals boven beschreven, sinds glibc versie 2.1. Tot glibc 2.0.6, zou dit -1 terug geven indien de uitvoer werd afgekapt.

BUGS
Omdat sprintf() en vsprintf() uitgaan van een arbitrair lange teken reeks, aanroepers moeten voorzichtig zijn de beschikbare ruimte niet te overlopen, hetgeen vaak onmogelijk is te verzekeren. Merk op dat de lengte van geproduceerde de teken reeksen is taalgebied afhankelijk aan moeilijk te voorspellen. Gebruik snprintf() en vsnprintf() in plaats van (of asprintf(3) en vasprintf(3)).

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 "Sonntag, 3. Juli, 10:02" kunnen verkrijgen.

Om een voldoende grote string toe te wijzen en ernaar af te drukken (correcte code voor zowel glibc 2.0 als glibc 2.1):

    #include <stdio.h>
    #include <stdlib.h>
    #include <stdarg.h>

    char *
    make_message(const char *fmt, ...)
    {
        int n = 0;
        size_t size = 0;
        char *p = NULL;
        va_list ap;

        /* Bepaal vereiste grootte. */

        va_start(ap, fmt);
        n = vsnprintf(p, size, fmt, ap);
        va_end(ap);

        if (n < 0)
            return NULL;

        size = (size_t) n + 1;      /* Een extra byte voor  '\0' */
        p = malloc(size);
        if (p == NULL)
            return NULL;

        va_start(ap, fmt);
        n = vsnprintf(p, size, fmt, ap);
        va_end(ap);

        if (n < 0) {
            free(p);
            return NULL;
        }

        return p;
    }

Als afbreken optreedt in glibc versies ouder dan 2.0.6, dan wordt dit behandeld als een fout in plaats van dat het elegant wordt afgehandeld.

ZIE OOK
printf(1), asprintf(3), puts(3), scanf(3), setlocale(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.