Specificatori de format (%d, %f, %s) în C

Ce înseamnă %d, %u, %f, %e, %s, %c, %x, %zu și cum controlezi lățimea, zecimalele și alinierea în printf.

Sintaxă
%[flag-uri][lățime][.precizie][lungime]tip

// exemple: %d  %5d  %-10s  %.2f  %08.3f  %lld  %zu  %x

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 %d pentru size_t sau pentru long. 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 %lf la printf crezând că e obligatoriu pentru double. La printf, %f și %lf sunt echivalente (din C99); diferența contează doar la scanf.
  • Afișezi un unsigned cu %d. Valorile mai mari decât INT_MAX apar negative. Folosește %u.
  • Te bazezi pe formatul lui %p sau pe %b. %p diferă 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.
Comunitate & Schimb de cunoștințe

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

Comunitate Adaugă o întrebare sau distribuie un cod

Moderare & Siguranță:

Pentru a menține calitatea și securitatea informațiilor, fiecare întrebare sau fragment de cod/prompt este analizat (manual sau prin moderare asistată de AI) înainte de publicare.