Movatterモバイル変換


[0]ホーム

URL:


Přeskočit na obsah
WikipedieWikipedie: Otevřená encyklopedie
Hledání

printf

Z Wikipedie, otevřené encyklopedie

printf jefunkce vprogramovacím jazyce C, která provádíformátovanývýpisdat vtextové podobě.

Funkce má proměnný počet parametrů a nastandardní výstup vypíšetextový řetězec zadaný prvnímparametrem, 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šíchprogramovacích jazyků a některéunixové shelly obsahují stejně pojmenovaný příkaz pro formátovaný výpis dat.

Příklad použití

[editovat |editovat zdroj]
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 |editovat zdroj]

Vestandardní knihovně jazyka C je několik podobných funkcí deklarovaných vhlavičkovém souborustdio.h:

  • printf – pro formátovaný výpis nastandardní výstup
  • fprintf – pro formátovaný výstup do libovolnéhosouboru, 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 (typuwchar_t); tyto funkce mají ve jméněwprintf místoprintf, a funkce deklarované vhlavičkovém souborustdarg.h, jimž se volitelné parametry předávají pomocí strukturyva_list, jejichž jména začínají písmenemv – například funkcevswprintf ukládá výstup zadaný strukturouva_list a formátovacím řetězcem typuwchar_t * a do řetězce téhož typu omezené délky (varianty prowide char pracují vždy s řetězci omezené délky a jejich jména místosn obsahují pouzesw).

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

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

Formátovací řetězec

[editovat |editovat zdroj]

Jedním z parametrů všech uvedených funkcí je formátovací řetězec, který může obsahovatsekvence 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 |editovat zdroj]

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

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

Typ

[editovat |editovat zdroj]

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

TypParametrVýznam
%(žádný)vypíše znak%
d,iceločíselnývypíše číslo vdesítkové soustavě se znaménkem
uceločíselnývypíše číslo vdesítkové soustavě bez znaménka
f,Fdoublevypíš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 (prof se vypisujeinf,infinity anan; proFINF,INFINITY aNAN)
e,Edoublevypíše hodnotu v semilogaritmickém tvaru ([-]d.ddde[+/-]ddd); podle použitého písmena budeE ve výpisu malé nebo velké; exponent má vždy nejméně dvě číslice; pro nulu je exponent00; ve Windows má exponent implicitně tři číslice, tj.1.5e002, lze změnit funkcí_set_output_format dostupnou v systémech Microsoftu
g,Gdoublevypíše hodnotu jako kratší z řetězců získaných formátyf,F neboe,E; na rozdíl od celočíselných formátů se nevypisují nevýznamné nuly
x,Xceločíselnývypíše číslo všestnáctkové soustavě bez znaménka, číslice 10 až 15 se pro typx vypisují malými písmenya,b,c,d,e,f, pro typX velkými písmenyA,B,C,D,E,F
oceločíselnývypíše číslo vosmičkové soustavě bez znaménka
schar *vypíše řetězec
ccharvypíše znak
pvoid *vypíše adresu
a,Adoublevypíše obsah bytů v šestnáctkovém zápise začínajícím0x nebo0X[1][2] (v C++11 iostreams funguje stejněhexfloat).
nukazatel naintNic 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íchUncontrolled format string

Velikost

[editovat |editovat zdroj]

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

VelikostVýznam
hhPro celočíselný formát je použit parametr typuchar.
hPro celočíselný formát je použit parametr typushort.
lPro celočíselný formát je použit parametr typulong.

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

llPro celočíselný formát je použit parametr typulong long.
LPro formát s pohyblivou řádovou čárkou je použit parametr typulong double.
zPro celočíselný formát je použit parametr typusize_t.
jPro celočíselný formát je použit parametr typuintmax_t.
tPro celočíselný formát je použit parametr typuptrdiff_t.

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

Přesnost

[editovat |editovat zdroj]

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 typuint.
Např.printf("%.*s", 3, "abcdef") vypíšeabc

Šířka

[editovat |editovat zdroj]

Šíř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 typuint
Např.printf("%0*d", 5, 10) vypíše00010.

Příznaky

[editovat |editovat zdroj]

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

PříznakVý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 typo vypisovat před nenulové číslo0
pro typx vypisovat před číslo0x
pro typX vypisovat před číslo0X
pro typye,E,f aF vždy psát desetinnou tečku
pro typyg aG 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ímcoprintf("%2X",3) vypíše 3, takprintf("%02X",3) vypíše03.

Číslo parametru

[editovat |editovat zdroj]

Čí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:

HodnotaVý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íše17 (11 hex); 16 (10 hex).

Odkazy

[editovat |editovat zdroj]

Reference

[editovat |editovat zdroj]

V tomto článku byl použitpřeklad textu z článkuprintf 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
Citováno z „https://cs.wikipedia.org/w/index.php?title=Printf&oldid=21276850
Kategorie:
Skrytá kategorie:

[8]ページ先頭

©2009-2026 Movatter.jp