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. Scrieprintf("%s", text)sauputs(text). - Uiți
\nși textul nu apare imediat pe ecran:stdouteste de obicei memorat în buffer până la un rând nou. Pune\nsau 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.