printf în C

Afișează text formatat pe ecran: un șablon cu specificatori (%d, %s, %.2f) completați cu valorile primite după el.

Sintaxă
#include <stdio.h>
int printf(const char *format, ...);

Ce face printf

printf (de la „print formatted”) scrie pe ieșirea standard (stdout, de obicei ecranul). Primul argument este un șablon de text; fiecare % din el este un specificator care spune unde și cum se pune următoarea valoare: %d pentru int, %f pentru numere zecimale, %s pentru șiruri, %c pentru un caracter.

Numărul și tipul valorilor trebuie să se potrivească exact cu specificatorii. Compilatorul verifică asta când șablonul este scris direct în cod (avertismentul -Wformat), dar standardul nu te protejează: un tip greșit dă comportament nedefinit.

printf nu trece singur la rândul următor: pui \n în șablon. Alte secvențe utile sunt \t (tab), \\ (backslash), \" (ghilimele). Ca să afișezi semnul procent, scrii %%. Lista completă a specificatorilor este pe pagina specificatori de format.

Parametri

Parametru Descriere
format Șablonul de text, cu specificatori care încep cu %.
... Valorile care înlocuiesc specificatorii, în aceeași ordine.

Ce returnează

Numărul de caractere (octeți) scrise sau o valoare negativă dacă a apărut o eroare de scriere.

Exemple

Exemplul 1: Text, numere și un caracter

Fiecare specificator ia, în ordine, câte o valoare din listă. %.2f afișează exact două zecimale, iar %% afișează semnul procent.

#include <stdio.h>

int main(void) {
    const char *nume = "Ana";
    int varsta = 21;
    double medie = 9.456;
    char grupa = 'B';

    printf("Salut, %s!\n", nume);
    printf("%s are %d de ani și este în grupa %c.\n", nume, varsta, grupa);
    printf("Media: %.2f (prezență 95%%)\n", medie);
    return 0;
}

Rezultat

Salut, Ana!
Ana are 21 de ani și este în grupa B.
Media: 9.46 (prezență 95%)

Exemplul 2: Un tabel aliniat cu tab și lățime fixă

%-8s rezervă 8 caractere și aliniază textul la stânga, %6.2f rezervă 6 caractere pentru număr, aliniat la dreapta. Lățimea se măsoară în octeți, de aceea orașele din exemplu sunt scrise fără diacritice (o literă ca „ș” ocupă 2 octeți în UTF-8 și ar strica alinierea).

#include <stdio.h>

int main(void) {
    const char *orase[] = {"Cluj", "Sibiu", "Oradea"};
    double preturi[] = {12.5, 9.75, 110.0};

    printf("%-8s %6s\n", "Oras", "Pret");
    for (int i = 0; i < 3; i++) {
        printf("%-8s %6.2f lei\n", orase[i], preturi[i]);
    }
    return 0;
}

Rezultat

Oras       Pret
Cluj      12.50 lei
Sibiu      9.75 lei
Oradea   110.00 lei

Exemplul 3: Valoarea returnată: câte caractere s-au scris

printf returnează numărul de octeți scriși, inclusiv \n. Rar este nevoie de el, dar e util la desenat linii de lungimea unui titlu. Atenție: se numără octeți, iar o literă cu diacritice ocupă doi, de aceea titlul este scris fără diacritice.

#include <stdio.h>

int main(void) {
    int lungime = printf("Raport lunar Cluj\n");
    for (int i = 0; i < lungime - 1; i++) {
        putchar('-');
    }
    printf("\nAm scris %d caractere pe primul rând.\n", lungime);
    return 0;
}

Rezultat

Raport lunar Cluj
-----------------
Am scris 18 caractere pe primul rând.

Greșeli frecvente

  • Pui o valoare de alt tip decât cere specificatorul, de exemplu printf("%d", 3.5). Rezultatul este comportament nedefinit (de obicei un număr fără sens). Compilează cu -Wall, ca să primești avertisment.
  • Scrii printf(text) cu un șir venit de la utilizator. Dacă textul conține %, printf îl interpretează ca specificator. Scrie printf("%s", text) sau puts(text).
  • Uiți \n și textul nu apare imediat pe ecran: stdout este de obicei memorat în buffer până la un rând nou. Pune \n sau apelează fflush(stdout).

Comenzi înrudite

  • Specificatori de format (%d, %f, %s): Ce înseamnă %d, %u, %f, %e, %s, %c, %x, %zu și cum controlezi lățimea, zecimalele și alinierea în printf.
  • puts și putchar: puts afișează un șir și trece la rând nou, putchar afișează un singur caracter; mai simple decât printf când nu formatezi nimic.
  • snprintf și sprintf: Formatează text ca printf, dar îl scrie într-un tablou de caractere; snprintf nu depășește niciodată dimensiunea dată.
  • fprintf: Scrie text formatat într-un fișier sau în stderr, cu același șablon ca printf.
  • 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.