Ce face std::printf
printf vine din limbajul C și primește un șablon cu marcaje care încep cu %, înlocuite în ordine cu valorile următoare. Marcaje uzuale: %d (int), %ld / %lld (long / long long), %zu (std::size_t), %f (double), %.2f (cu 2 zecimale), %s (șir C), %c (caracter), %x (hexazecimal), %% (semnul procent).
Între % și literă poți pune lățime și aliniere: %5d (dreapta, 5 coloane), %-10s (stânga, 10 coloane), %05d (zerouri în față).
Marcajul trebuie să se potrivească exact cu tipul valorii; altfel comportamentul este nedefinit. Compilatoarele verifică șablonul și dau avertismente. În C++23, std::println este alternativa sigură.
Parametri
| Parametru | Descriere |
|---|---|
format |
Șablonul cu marcaje %. |
... |
Valorile, în ordinea marcajelor. |
Ce returnează
Numărul de caractere (octeți) afișate, sau o valoare negativă la eroare.
Exemple
Exemplul 1: Marcaje de bază
#include <cstdio>
int main() {
const char* produs = "Laptop";
int bucati = 2;
double pret = 2499.9;
std::printf("%s: %d bucăți x %.2f lei = %.2f lei\n", produs, bucati, pret, bucati * pret);
std::printf("Caracter: %c, hexa: %x, procent: 15%%\n", 'A', 255);
}
Rezultat
Laptop: 2 bucăți x 2499.90 lei = 4999.80 lei
Caracter: A, hexa: ff, procent: 15%
Exemplul 2: Tabel aliniat
#include <cstdio>
int main() {
const char* nume[] = {"Ana", "Bogdan", "Ioana"};
double medii[] = {9.5, 8.25, 10};
std::printf("%-8s|%6s\n", "Nume", "Medie");
for (int i = 0; i < 3; ++i) {
std::printf("%-8s|%6.2f\n", nume[i], medii[i]);
}
std::printf("Factura nr. %05d\n", 42);
}
Rezultat
Nume | Medie
Ana | 9.50
Bogdan | 8.25
Ioana | 10.00
Factura nr. 00042
Exemplul 3: Valoarea returnată și std::string
Un std::string se trimite prin c_str(). printf numără octeți, deci „ș” contează de două ori.
#include <cstdio>
#include <string>
int main() {
std::string oras = "Iași";
int n = std::printf("Oraș: %s\n", oras.c_str());
std::printf("Au fost scriși %d octeți\n", n);
}
Rezultat
Oraș: Iași
Au fost scriși 13 octeți
Greșeli frecvente
- Trimiți un
std::stringdirect la%s:printf("%s", s)este comportament nedefinit. Foloseștes.c_str(). - Folosești
%dpentrustd::size_tsau%fpentruint: valoarea afișată este greșită (sau programul se strică). Marcajul trebuie să corespundă tipului:%zupentrusize_t. - Pui textul utilizatorului ca șablon:
printf(text). Dacă textul conține%, se citesc argumente inexistente. Scrieprintf("%s", text).
Comenzi înrudite
std::println: Afișează text formatat cu acolade {} și trece pe rândul următor (C++23).std::snprintf: Scrie text formatat ca printf într-un tablou de char, fără să-i depășească mărimea.std::scanf: Citește valori formatate de la tastatură în stil C, primind adresele variabilelor.std::puts: Afișează un șir C și trece pe rândul următor.std::format: Construiește un std::string dintr-un șablon cu acolade {} și valori (C++20).