% jel szerepe a kiíratásokban
Amikor a printf utasításban (és a hozzá hasonló utasításokban) % jelet használsz, akkor arra utasítod a fordítóprogramot, hogy oda helyettesítsen be valamit. Ezt a valamit a szöveg után sorolod fel vesszőkkel elválasztva.
A legegyszerűbb példa, amikor két egész számot írunk ki egy printf utasításban:
...
printf("a=%d b=%d",a,b);
...
Az általános formája a következő:
% [jelzés] [hossz] [precízió] [méretjel] típus
Igaz, ennek az 5 adtnak a felét sem fogod használni remélhetőleg. De néhányuk egész hasznos.
Jelzés:
A kiíratás módját adja meg.
Jelzés |
Jelentés |
- | balra igazítja kimenetet a mezőben. |
+ | számok elé mindig kirakja az előjelet. Akkor is, ha pozitív a szám. |
# | alternatív formában írja ki a szöveget. (Nem sűrűn használtam még.) |
(semmi) | pozitív számok elé nem ír plusz jelet. A negatívok elé ugyanúgy kiteszi a mínuszt. |
Több is megadható közülük.
Hossz:
Azt adja meg, hogy milyen hosszú mezőbe írja ki a szöveget
Megadás módja |
Jelentés |
n | Legalább n db karaktert kiír, ha kiírott szöveg ennél rövidebb, akkor a maradék helyet szóközökkel tölti fel. Alapértelmezés az, hogy a mezőn belül jobbra igazítja a szöveget. Ha a - jelzés meg van adva, akkor balra igazít. |
0n | Ugyanaz, mint előbb, csak az üres helyeket nullákkal tölti ki, és mindig baloldalon. |
* | A string utáni paraméterek adják meg a kiírandó szöveg hosszát. |
Ha a szöveg hosszabb, mint a megadott mezőhossz, akkor a szöveg egyszerűen ki fog belőle lógni.
Precízió:
A kiírandó tizedes jegyek számát határozza meg:
Precízió megadási módja |
Jelentés |
(semmi) | Alapértelmezés Nincs tizedesjegy a d, i, o, u, x, X típusoknál. 6 tizedes jegy az e, E, f típusoknál. Minden értékes jegy a g, G típusoknál. Nincs hatása a c típusra |
.0 | Nem ír ki tizedeseket. |
.n | Megadott számú tizedes jegyet ír ki. |
. | Az egyik paraméter fogja megadni, hogy hány tizedes jegyet kell majd kiírni. |
Méretjel:
A paraméter méretét adja meg, ha a paraméter mérete más, mint amit a típusjel feltételez.
Méretjel |
Milyen típusjelekkel használatos |
Jelentés |
F | p, s, n | Távoli pointer (4 bájt) |
N | p, s, n | Közeli pointer (2 bájt) |
h | d, i, o, u, x, X | Rövid egészszám (2 bájt) (short típus) |
l | d, i, o, u, x, X | Hosszú egészszám (4 bájt) (long típus) |
e, E, f, g, G | Dupla pontosságú valós szám (8 bájt) (double típus) | |
L | e, E, f, g, G | Kiterjesztett pontosságú valós szám (10 bájt) (long double típus) |
Típusjel:
A szöveg megadásakor közölnünk kell a géppel, hogy milyen típusú adatként kell értelmeznie a megadott paramétert. Ezt a típusjellel adjuk meg.
Típusjel |
Várt adattípus |
Jelentés |
Számok: |
||
d | int (16 bites rendszer: 2bájt; 32 bites: 4bájt) | Előjeles egészszámot ír ki. |
i | int (16 bites rendszer: 2bájt; 32 bites: 4bájt) | Előjeles egészszámot ír ki. |
o | unsigned int (16 bites rendszer: 2bájt; 32 bites: 4bájt) | 8-as számrendszerben írja ki a számot. |
u | unsigned int (16 bites rendszer: 2bájt; 32 bites: 4bájt) | Előjel nélküli egészszámot ír ki. |
x | unsigned int (16 bites rendszer: 2bájt; 32 bites: 4bájt) | 16-os számrendszerben írja ki a számot (10 fölötti számjegyekhez abcdef betűket használva) |
X | unsigned int (16 bites rendszer: 2bájt; 32 bites: 4bájt) | 16-os számrendszerben írja ki a számot (10 fölötti számjegyekhez ABCDEF betűket használva) |
f | float (4 bájt) | Valós számot ír ki
tizedesponttal [-]ddddd.dddddd alakban. Pl.: 34.35446 |
e | float (4 bájt) | Normálalakban írja ki a
számokat. [-]d.dddddde[+/-]ddd alakban. Pl.: -4.34444222223e+03 |
g | float (4 bájt) | A kisebb számokat rendesen. A nagyobbakat pedig normálalakban írja ki. |
E | float (4 bájt) | Ugyanaz, mint az e, csak itt nagy E betűvel jelöli az exponenst |
G | float (4 bájt) | Ugyanaz, mint a g, csak itt nagy E betűvel jelöli az exponenst, ha normálalakban ír ki. |
Szöveg: |
||
c | char (1 bájt) | Karakterként írja ki a számot. |
s | char * (2, 4 bájt memóriamodelltól függően) | Karakterláncot ír ki. A szöveg a 0-ás kódú karakterig tart. |
% | - | A % jel kiíratására szolgál. |
Pointerek: |
||
n | int * (2, 4 bájt memóriamodelltól függően) | A megadott pointer által mutatott memóriacímre eltárolja, hogy eddig hány karaktert írt ki. Kiírást nem végez. |
p | void * (2, 4 bájt memóriamodeltől függően) | A pointer memóriacímét írja ki. XXXX:YYYY formátumban, vagy YYYY formátumban, ha közeli pointer. |
A teljesség igényével mindent feltüntettem.
De igazából ezekből nem sokat használunk, a leggyakoribbak ezek:
%d | Egy egész szám kiírása |
%g | Egy valós szám kiírása |
%-0.2f | Egy valós szám kiírása két tizedesre kerekítve |
%c | Egy karakter kiírása |
%u,
a hozzátartozó paraméter pedig: (unsigned)(unsigned char)karakter |
Jó módszer, ha egy karakter ASCII kódját akarod kiírni |
%s | Karakterlánc kiíratása |
%-0.2Lf | long double típusú valós szám kiíratása |
%ld | long típusú egész szám kiíratása |
%lu | unsigned long típusú szám kiíratása |
%02d | Jó módszer, ha egy órát akarsz kiíratni. Két karakter mezőszélesség, elé egy nulla, ha tíznél kisebb. Tökéletes módszere a perek és a másodpercek kiíratásának. |