[go: up one dir, main page]

printf

funkce pro výpis formátovaného řetězce původně pocházející z jazyka C, později použitá i v dalších jazycích

printf je funkce v programovacím jazyce C, která provádí formátovaný výpis dat v textové podobě.

Funkce má proměnný počet parametrů a na standardní výstup vypíše textový řetězec zadaný prvním parametrem, v němž jsou formátovací direktivy nahrazeny hodnotami dalších parametrů. Použitý způsob formátování byl převzat do mnoha dalších programovacích jazyků a některé unixové shelly obsahují stejně pojmenovaný příkaz pro formátovaný výpis dat.

Příklad použití

editovat
printf("Dnes je %s %d. %s %d; teplota je %+.1f stupňů Celsia.\n", dny_v_tydnu[dt], den, mesice[mesic], rok, teplota);

může vypsat

Dnes je středa 11. července 2018; teplota je +20.5 stupňů Celsia.

s odřádkováním na konci.

Příbuzné funkce

editovat

Ve standardní knihovně jazyka C je několik podobných funkcí deklarovaných v hlavičkovém souboru stdio.h:

  • printf – pro formátovaný výpis na standardní výstup
  • fprintf – pro formátovaný výstup do libovolného souboru, resp. datového proudu otevřeného pro výstup
  • sprintf – ukládá výstup do řetězce
  • snprintf – ukládá výstup do řetězce omezené délky

Dále existují varianty pro výstup řetězců v kódování UTF-32 složených ze znaků wide char (typu wchar_t); tyto funkce mají ve jméně wprintf místo printf, a funkce deklarované v hlavičkovém souboru stdarg.h, jimž se volitelné parametry předávají pomocí struktury va_list, jejichž jména začínají písmenem v – například funkce vswprintf ukládá výstup zadaný strukturou va_list a formátovacím řetězcem typu wchar_t * a do řetězce téhož typu omezené délky (varianty pro wide char pracují vždy s řetězci omezené délky a jejich jména místo sn obsahují pouze sw).

Všechny uvedené funkce vracejí počet zapsaných znaků nebo zápornou hodnotu v případě chyby.

Podobnou filozofii mají funkce řady scanf, které provádějí naopak vstupní konverzi.

Formátovací řetězec

editovat

Jedním z parametrů všech uvedených funkcí je formátovací řetězec, který může obsahovat sekvence pro výpis řídicích znaků začínající znakem zpětné lomítko (\) a formátovací direktivy začínající znakem procento (%).

Syntaxe

editovat

Syntaxe formátovacích direktiv je následující:

%[číslo parametru][příznaky][šířka][.přesnost][velikost]typ

Jako typ lze použít některý z níže uvedených znaků:

Typ Parametr Význam
% (žádný) vypíše znak %
d, i celočíselný vypíše číslo v desítkové soustavě se znaménkem
u celočíselný vypíše číslo v desítkové soustavě bez znaménka
f, F double vypíše číslo ve formátu s pohyblivou řádovou tečkou; malé a velké f se liší pouze ve způsobu výpisu nekonečna a chybného čísla (pro f se vypisuje inf, infinity a nan; pro F INF, INFINITY a NAN)
e, E double vypíše hodnotu v semilogaritmickém tvaru ([-]d.ddd e[+/-]ddd); podle použitého písmena bude E ve výpisu malé nebo velké; exponent má vždy nejméně dvě číslice; pro nulu je exponent 00; ve Windows má exponent implicitně tři číslice, tj. 1.5e002, lze změnit funkcí _set_output_format dostupnou v systémech Microsoftu
g, G double vypíše hodnotu jako kratší z řetězců získaných formáty f, F nebo e, E; na rozdíl od celočíselných formátů se nevypisují nevýznamné nuly
x, X celočíselný vypíše číslo v šestnáctkové soustavě bez znaménka, číslice 10 až 15 se pro typ x vypisují malými písmeny a, b, c, d, e, f, pro typ X velkými písmeny A, B, C, D, E, F
o celočíselný vypíše číslo v osmičkové soustavě bez znaménka
s char * vypíše řetězec
c char vypíše znak
p void * vypíše adresu
a, A double vypíše obsah bytů v šestnáctkovém zápise začínajícím 0x nebo 0X[1][2] (v C++11 iostreams funguje stejně hexfloat).
n ukazatel na int Nic nevypisuje, ale do příslušného parametru uloží počet dosud vypsaných znaků (v rámci tohoto vyvolání printf
Java: indikuje platformně neutrální znak konce řádku[3]
Poznámka: tento parametr může být zneužit při útocích Uncontrolled format string

Velikost

editovat

Pole velikost udává přesný typ příslušného parametru:

Velikost Význam
hh Pro celočíselný formát je použit parametr typu char.
h Pro celočíselný formát je použit parametr typu short.
l Pro celočíselný formát je použit parametr typu long.

Pro formát s pohyblivou řádovou čárkou nemá žádný efekt.[4]

ll Pro celočíselný formát je použit parametr typu long long.
L Pro formát s pohyblivou řádovou čárkou je použit parametr typu long double.
z Pro celočíselný formát je použit parametr typu size_t.
j Pro celočíselný formát je použit parametr typu intmax_t.
t Pro celočíselný formát je použit parametr typu ptrdiff_t.

Např.: printf("%ld", (long int) 1234567)

Přesnost

editovat

U formátů s pohyblivou řádovou čárkou udává, na kolik desetinných míst má být výpis čísla zaokrouhlen; u řetězců udává maximální počet znaků, které mají být vypsány.

Pole může být vynecháno, může být zadáno číslem, nebo hvězdičkou; hvězdička znamená, že hodnota je zadána parametrem typu int.
Např. printf("%.*s", 3, "abcdef") vypíše abc

Šířka

editovat

Šířka udává minimální počet znaků, které mají být vypsány; pokud by byl výstup kratší bude doplněn mezerami (přesný způsob závisí na použitých příznacích). Pole šířka nikdy nezpůsobí zkrácení výpisu.

Zadání šířky může být vynecháno, může být použito číslo, nebo hvězdička; hvězdička znamená, že hodnotu udává další parametr typu int
Např. printf("%0*d", 5, 10) vypíše 00010.

Příznaky

editovat

Je možné použít žádný, jeden nebo více příznaků v libovolném pořadí:

Příznak Význam
-
(minus)
zarovnat vlevo, vpravo doplnit mezerami
+
(plus)
před číslem vždy vypsat znaménko (i plus)
 
(mezera)
před záporným číslem vypsat -, před kladným mezeru
#
(hash)
použít alternativní formát výpisu:

pro typ o vypisovat před nenulové číslo 0
pro typ x vypisovat před číslo 0x
pro typ X vypisovat před číslo 0X
pro typy e, E, f a F vždy psát desetinnou tečku
pro typy g a G vždy psát tečku, neusekávat koncové nuly

0
(nula)
Pokud je použito pro numerický typ a je zadána šířka, doplní číslo na zadanou šířku zleva nulami; zatímco printf("%2X",3) vypíše  3, tak printf("%02X",3) vypíše 03.

Číslo parametru

editovat

Číslo parametru je rozšíření POSIX, které není obsaženo v normě C99. Používá se například při lokalizaci softwaru, když je potřeba změnit pořadí slov zadaných jako parametry. Pokud je číslo parametru použito v jedné formátovací direktivě, musí být použito u všech v daném volání printf. Jeho tvar je:

Hodnota Význam
n$ n je číslo parametru, který má být vypsán touto formátovací direktivou; opakováním téhož čísla je možné vypsat jeden parametr vícekrát i s použitím různých formátů
Např. printf("%2$d (%2$x hex); %1$d (%1$x hex)",16,17) vypíše 17 (11 hex); 16 (10 hex).

Reference

editovat

V tomto článku byl použit překlad textu z článku printf format string na anglické Wikipedii.

  1. "The GNU C Library Reference Manual", "12.12.3 Table of Output Conversions" [online]. Gnu.org [cit. 2014-03-17]. Dostupné online. 
  2. "printf" (%a přidáno v C99)
  3. Formatting Numeric Print Output [online]. Oracle Inc. [cit. 2018-03-19]. Dostupné online. 
  4. ISO/IEC (1999). ISO/IEC 9899:1999(E): Programming Languages - C §7.19.6.1 para 7