Ce face Specificatori de format (%d, %f, %s)
Un specificator începe cu % și se termină cu o literă care spune tipul: d/i întreg cu semn, u întreg fără semn, f zecimal, e notație științifică, g forma cea mai scurtă dintre f și e, c caracter, s șir, x/X hexazecimal, o octal, p adresă (pointer), %% semnul procent.
Între % și literă poți pune: flag-uri (- aliniere la stânga, + semn și la pozitive, 0 completare cu zerouri, spațiu, # prefix 0x), lățimea minimă (%5d), precizia (%.2f = două zecimale, %.3s = maximum 3 caractere) și modificatorul de lungime pentru tipuri mai mari: l (long), ll (long long), z (size_t), hh/h (char/short).
Lățimea și precizia pot veni și din argumente, cu *: printf("%*d", 6, x). Pentru tipurile din <stdint.h> există macro-uri în <inttypes.h>, de exemplu PRId64 pentru int64_t. La printf, %f merge și pentru float, și pentru double; la scanf nu (acolo double cere %lf).
Parametri
| Parametru | Descriere |
|---|---|
%d, %i |
int zecimal cu semn; %ld pentru long, %lld pentru long long. |
%u |
unsigned int; %lu, %llu pentru variantele lungi. |
%zu |
size_t, tipul returnat de sizeof și strlen (C99). |
%f, %e, %g |
double (și float, convertit automat): zecimal, științific, forma cea mai scurtă. Implicit 6 zecimale. |
%c |
Un caracter (int convertit la unsigned char). |
%s |
Șir terminat cu '\0' (char *). |
%x, %X, %o |
Întreg fără semn în hexazecimal (litere mici/mari) sau octal. |
%p |
Adresa dintr-un pointer, convertit la void *; formatul depinde de sistem. |
%% |
Semnul %. |
Exemple
Exemplul 1: Același număr în mai multe forme
Precizia schimbă numărul de zecimale, %e folosește puteri ale lui 10, iar %g elimină zerourile de la final.
#include <stdio.h>
int main(void) {
double pret = 1234.5;
int cod = 255;
printf("%%f -> %f\n", pret);
printf("%%.2f -> %.2f\n", pret);
printf("%%.0f -> %.0f\n", pret);
printf("%%e -> %e\n", pret);
printf("%%g -> %g\n", pret);
printf("%%d %%x %%X %%o %%#x -> %d %x %X %o %#x\n", cod, cod, cod, cod, cod);
return 0;
}
Rezultat
%f -> 1234.500000
%.2f -> 1234.50
%.0f -> 1234
%e -> 1.234500e+03
%g -> 1234.5
%d %x %X %o %#x -> 255 ff FF 377 0xff
Exemplul 2: Lățime, aliniere, zerouri și semn
Parantezele drepte arată exact câte caractere ocupă fiecare valoare. %05d completează cu zerouri, %+d afișează semnul și la numere pozitive, %*d ia lățimea din argument.
#include <stdio.h>
int main(void) {
int nota = 9;
printf("[%5d]\n", nota);
printf("[%-5d]\n", nota);
printf("[%05d]\n", nota);
printf("[%+d] [%+d]\n", nota, -nota);
printf("[%*d]\n", 8, nota);
printf("[%8.3f]\n", 3.14159);
printf("[%.3s]\n", "Bucuresti");
return 0;
}
Rezultat
[ 9]
[9 ]
[00009]
[+9] [-9]
[ 9]
[ 3.142]
[Buc]
Exemplul 3: Tipuri mari: long long, size_t, int64_t
Fiecare tip are modificatorul lui. PRId64 este un șir (de exemplu "lld") care se lipește de restul șablonului, așa că codul merge pe orice sistem.
#include <inttypes.h>
#include <stdio.h>
#include <string.h>
int main(void) {
long long populatie_ro = 19000000LL;
unsigned long trafic = 4000000000UL;
size_t lungime = strlen("Timisoara");
int64_t bani = -9000000000;
printf("Populație: %lld\n", populatie_ro);
printf("Trafic: %lu\n", trafic);
printf("Lungime: %zu\n", lungime);
printf("Sold: %" PRId64 " lei\n", bani);
return 0;
}
Rezultat
Populație: 19000000
Trafic: 4000000000
Lungime: 9
Sold: -9000000000 lei
Greșeli frecvente
- Folosești
%dpentrusize_tsau pentrulong. Pe sisteme de 64 de biți tipurile au alt număr de octeți și valoarea afișată poate fi greșită. Folosește%zu,%ld,%lld. - Folosești
%lflaprintfcrezând că e obligatoriu pentrudouble. Laprintf,%fși%lfsunt echivalente (din C99); diferența contează doar lascanf. - Afișezi un
unsignedcu%d. Valorile mai mari decâtINT_MAXapar negative. Folosește%u. - Te bazezi pe formatul lui
%psau pe%b.%pdiferă de la un sistem la altul, iar%b(binar) a apărut abia în C23 și nu este suportat încă de toate bibliotecile (de exemplu biblioteca C din macOS).
Comenzi înrudite
printf: Afișează text formatat pe ecran: un șablon cu specificatori (%d, %s, %.2f) completați cu valorile primite după el.scanf: Citește valori de la tastatură după un șablon (%d, %lf, %s) și le scrie la adresele primite; returnează câte valori a citit.snprintf și sprintf: Formatează text ca printf, dar îl scrie într-un tablou de caractere; snprintf nu depășește niciodată dimensiunea dată.stdint.h și limits.h: Tipuri întregi cu dimensiune exactă (int32_t, uint8_t) și constantele cu valorile minime și maxime ale tipurilor (INT_MAX).sizeof: Operatorul care spune câți octeți ocupă un tip sau o variabilă; calculat de compilator, rezultatul are tipul size_t.
Întrebări & Exemple de Cod:
Specificatori de format (%d, %f, %s)Ai o nelămurire despre utilizarea comenzii
Specificatori de format (%d, %f, %s)sau ai descoperit un truc / fragment de cod util? Distribuie-l cu ceilalți programatori!Fii primul care pune o întrebare sau distribuie un fragment de cod / prompt!
Nu au fost adăugate încă întrebări sau exemple de cod pentru această pagină. Dacă ai întâlnit o problemă sau ai un snippet util, adaugă-l mai jos pentru a-i ajuta pe ceilalți.