Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!
Zadejte Vaši e-mailovou adresu:
Kamarád fotí rád?
Přihlas ho k odběru fotomagazínu!
Zadejte e-mailovou adresu kamaráda:
C/C++
Učíme se C (12.díl) - Formátový specifikátor
4. prosince 2000, 00.00 | Bližší informace o použití formátového specifikátoru ve funkcích printf a scanf.
Formátový specifikátor (popisovač)Dnešní díl bude úzce navazovat na díl předchozí, a proto, pokud se necítíte zcela jisti při použití funkcí scanf a printf, bych doporučoval jeho, alespoň zběžné, pročtení. Jestliže jsme se minule zaměřili na funkce printf a scanf, měli bychom se dnes trochu blíže podívat na formátový specifikátor. Jeho použití může být ještě mnohem složitější, než jsme si dosud uváděli. Kromě znaku konverze totiž může obsahovat i další znaky, které dále upřesňují formu výpisu.
- Formátový specifikátor funkce printf -
Pro funkci printf a jí příbuzné je formát popisovače takovýto:
%[příznaky][šířka][.přesnost][modifikátor]konverze
znak konverze
Jak už bylo řečeno minule, znak konverze říká funkci printf (scanf), jakým způsobem interpretovat a konvertovat data získaná z parametrů funkce. Můžeme volit mezi těmito znaky konverze:
d | desítkové číslo typu signed int |
i | desítkové číslo typu signed int |
u | desítkové číslo typu unsigned int |
o | osmičkové číslo typu unsigned int |
x | šestnáctkové číslo typu unsigned int s malými znaky písmen |
X | šestnáctkové číslo typu unsigned int s velkými znaky písmen |
f | desítkové číslo typu double v desetinném tvaru |
e | desítkové číslo typu double v semilogaritmickém tvaru s malým znakem 'e' |
E | desítkové číslo typu double v semilogaritmickém tvaru s velkým znakem 'E' |
g | desítkové číslo typu double, přičemž normální (f) nebo semilogaritmický tvar (e) se zvolí automaticky podle hodnoty argumentu a přesnosti (viz. dále). |
G | jako konverze g, ale pro semilogaritmický zápis zvolí konverzi E |
c | jeden znak |
s | řetězec |
p | ukazatel |
int i=28; printf("%i %o %x", i, i, i); // vypíše hodnotu i v decimálním, octalovém a hexadecimálním tvaru // takto: 28 34 1c double d=3478.12589; printf("%f %e", d, d); // vypíše hodnotu d v normálním a semilogaritmickém tvaru // takto: 3478.125890 3.478126e+03
modifikátor
Modifikátor je znak, který mění velikost typu konverze číselných parametrů následujícím způsobem.
h | konverze d, i, u, o, x zkracuje z typu int na short int |
l | konverze d, i, u, o, x zvětšuje z typu int na long int |
L | konverze f, e, g mění na long double |
short int i=28; long int l=8489821; long double d=3478.12589; printf("%hi %li %Lf", i, l, d); // jednoduše vytiskne hodnoty i, l, d;
přesnost
Desítkové číslo určující
- minimální počet cifer čísla pro konverze d, i, u, o, x a X. Před číslo tedy bude doplňen potřebný počet nul.
- počet cifer za desetinnou tečkou pro konverze f, e, E. Je-li skutečný počet cifer větší, je číslo zaokrouhleno. V opačném případě jsou doplněny nuly.
- maximální počet významových cifer. Tato hodnota také ovlivňuje použití výpisu f nebo e pro konverze g, G
- maximální počet tištěných znaků pro konverzi s
int i=28; double d=3478.12; char s[]="pokus"; printf("%.6i %.4f %.3s", i, d, s); //vytiskne hodnoty i, d a část řetězce s //takto: 000028 3478.1200 pok
šířka
Je to číslo (nebo znak '*'), které určuje minimální počet vypisovaných znaků podle následujících pravidel:
n | Tiskne minimálně n znaků, přičemž za chybějící znaky doplňuje mezery zprava. |
0n | Tiskne minimálně n znaků, přičemž za chybějící znaky se doplňují nuly zleva. |
* | Minimální počet tištěných znaků udává hodnota předchozího parametru (Ten ovšem slouží pouze tomuto účelu. Proto nemá odpovídající popisovač a jeho hodnota se tedy netiskne). |
int i=28, j=5; printf("%06i%6i %0*i\n", i, i, j, i); //třikrát vytiskne hodnotu i. Celý výpis bude vypadat //takto: 000028 28 00028
příznak
Jako znak příznaku můžeme použít některý z následujících znaků. Je ale možné tyto znaky i vzájemně kombinovat.
- | Tištěná hodnota se zarovná doleva, místo implicitního nastavení doprava, pokud hodnota položky šířka nutí k doplnění mezer. |
+ | Vynutí tištění znaménka + nebo – |
# | Před osmičkové číslo doplní 0, před šestnáctkové 0x (0X) a vynutí použití desetinné tečky pro typ double i v případě, že by za ní nebyly již žádné číslice. |
int i=28; printf("%+i %#o %#x\n", i, i, i); // vytiskne hodnotu i v desitkovém, osmičkovém //a šestnáctkovém tvaru takto: +28 034 0x1c printf("%+6i %#6o %#6x\n", i, i, i); // pro každou hodnotu se navíc tiskne // minimálně 6 znaků. Chybějící znaky jsou // zleva doplněny mezerami. (zarovnání doprava) printf("%-+6i %-#6o %-#6x\n", i, i, i); // stejný výpis zarovnaný doleva
- Formátový specifikátor funkce scanf -
Funkce rodiny scanf používají tento formát popisovače:
%[*][šířka][modifikátor]konverze
Znak '*' ve formátovém specifikátoru funkce scanf potlačí přiřazení načtené hodnoty. Vstupní data jsou tedy normálně přečtena, pouze nedojde k jejich uložení. Použijem-li znak '*', pak nemusí být (a není) hledán odpovídající parametr, do kterého by se hodnota uložila. Proto pozor, aby vám jeden parametr nepřebýval.
Šířka v tomto případě definuje maximum počtu načítaných znaků. Je-li tedy načteno šířka znaků ze vstupu a přitom ještě není načteno celé vstupní pole, čtení je stejně ukončeno (Je ukončeno pouze načítání do příslušného parametru. Jinak se pokračuje normálně dál.)
Modifikátor a konverze mají stejný význam jako pro printf.
char str[6]=""; scanf("%*f %5s", str); // ze vstupu přečte float číslo, které ale nikam neuloží. // Pak přečte maximálně 5 znaků a uloží je do řetězce str. puts(str);
Obsah seriálu (více o seriálu):
- Učíme se C (1. díl)
- Učíme se C (2. díl)
- Učíme se C (3.díl)
- Učíme se C (4. díl)
- Učíme se C (5.díl)
- Učíme se C (6.díl)
- Učíme se C (7.díl)
- Učíme se C (8.díl)
- Učíme se C (9.díl) - Řetězce
- Učíme se C (10.díl) - Vstupně výstupní funkce
- Učíme se C (11.díl) - Formátovaný výstup
- Učíme se C (12.díl) - Formátový specifikátor
- Učíme se C (13.díl)
- Učíme se C (14.díl) - Vícerozměrná pole
- Učíme se C (15.díl) - Ukazatele
- Učíme se C (16.díl) - Modifikátory paměťové třídy
- Učíme se C (17.díl) - Pole a ukazatel
- Učíme se C (18. díl) - Dynamická alokace paměti
- Učíme se C (19. díl) - Práce se soubory I.
- Učíme se C (20. díl) - Práce se soubory II.
- Učíme se C (21. díl) - Parametry funkce main()
- Učíme se C (22. díl) - Ukazatele na funkce
- Učíme se C (23. díl) - Složité deklarace a definice
- Učíme se C (24. díl) - Funkce s proměnným počtem parametrů
- Učíme se C (25. díl) - Bitové operátory a bitové pole
- Učíme se C (26. díl) - Datové typy enum a union
- Učíme se C (27. díl - závěr) - Programové moduly
-
25. listopadu 2012
-
30. srpna 2002
-
10. října 2002
-
4. listopadu 2002
-
12. září 2002
-
25. listopadu 2012
-
28. července 1998
-
31. července 1998
-
28. srpna 1998
-
6. prosince 2000
-
27. prosince 2007
-
4. května 2007