vsprintf

PRINTF(3)                Linux Programmeurs Handleiding                PRINTF(3)



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

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(char *restrict str, size_t size,
                   const char *restrict format, ...);

       #include <stdarg.h>

       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(char *restrict str, size_t size,
                   const char *restrict format, va_list ap);

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

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

       dprintf(), vdprintf():
           Since glibc 2.10:
               _POSIX_C_SOURCE >= 200809L
           Before 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
       uitvoert naar een bestandsbeschrijving, fd, in plaats van naar de stdio
       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.b.., 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 gekopiërd; en conversie specificaties, die elk
       zorgen dat nul of meer opeenvolgende argumentengepakt 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 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 argumentenzijn gegeven). Men kan ook
       expliciet opgeven welk argument genomen zal worden, op elke plaats waar
       een argument vereist is, door "%m$" te schrijven inplaats van '%' en
       "*m$" inplaats van '*', waar het decimale hele getal m de positie in de
       argumenten lijst van het gewenst argument bepaald, genummerd vanaf 1.
       Dus,

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

       en

           printf("%2$*1$d", width, 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, alsargumenten 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 "localiteit"
       (zie setlocale(3)). De POSIX localiteit 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 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. De
       Single UNIX Specification specificeert een vlag additioneel teken.

       '      Voor decimale conversie (i, d, u, f, F, g, G) moet de uitvoer
              gegroepeerd worden met duizendtallen scheidingstekens, als het
              taalgebied die aan geeft (zie setlocale(3)).  Merk op dat veel
              versies van gcc(1) deze optie niet kunnen lezen, en een
              waarschuwing zullen geven. (SUSv2 bevatte %'F niet, maar SUSv3
              voegde het toe.

       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      (el)  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.

       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.

       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 aanpasser is: Het const char * argument wordt
              aangenomen een wijzer naar een rij van character type (wijzer naar
              een tekenreeks) te zijn.  Tekens van de rij worden geschreven tot
              aan (en zonder) een afsluitend NULL teken; 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.)  Toon
              uitvoer van strerror(errno).  Geen argument is vereist.

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

EIND WAARDE
       Bij succesvolle terugkeer, retourneren 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.)

       Als er een uitvoer fout werd vastgesteld, dan wordt een negatieve waarde
       teruggegeven.

ATTRIBUTEN
       Voor een uitleg van de termen in deze sectie, zie attributes(7).

       ┌───────────────────────────────┬───────────────────┬────────────────────┐
       │Interface                      Attribuut         Waarde             │
       ├───────────────────────────────┼───────────────────┼────────────────────┤
       │printf(), fprintf(),           │ Thread veiligheid │ MT-Safe taalgebied │
       │sprintf(), snprintf(),         │                   │                    │
       │vprintf(), vfprintf(),         │                   │                    │
       │vsprintf(), vsnprintf()        │                   │                    │
       └───────────────────────────────┴───────────────────┴────────────────────┘

VOLDOET AAN
       fprintf(), printf(), sprintf(), vprintf(), vfprintf(), vsprintf():
       POSIX.1-2001, POSIX.1-2008, C89, C99.

       snprintf(), vsnprintf(): POSIX.1-2001, POSIX.1-2008, C99.

       De dprintf()  en vdprintf()  functies waren oorspronkelijk GNU
       uitbreidingen die later zijn gestandaardiseerd in POSIX.1-2008.

       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.

       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.

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

           sprintf(buf, "%s some further text", 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 als 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\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;

           /* Determine required size. */

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

           if (n < 0)
               return NULL;

           size = (size_t) n + 1;      /* One extra byte for '\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)

COLOFON
       Deze pagina is onderdeel van release 5.11 van het Linux
       man-pages-project. Een beschrijving van het project, informatie over het
       melden van bugs en de nieuwste versie van deze pagina zijn op
       https://www.kernel.org/doc/man-pages/ te vinden.


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 ⟨⟩.



GNU                               22 maart 2021                        PRINTF(3)