% 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.