Učíme se C (12.díl) - Formátový specifikátor - Builder.cz - Informacni server o programovani

Odběr fotomagazínu

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):

Tématické zařazení:

 » Rubriky  » C/C++  

 

 

 

Nejčtenější články
Nejlépe hodnocené články

 

Přihlášení k mému účtu

Uživatelské jméno:

Heslo: