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