std::printf în C++

Afișează text formatat în stil C, cu marcaje precum %d, %s, %.2f.

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

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::string direct la %s: printf("%s", s) este comportament nedefinit. Folosește s.c_str().
  • Folosești %d pentru std::size_t sau %f pentru int: valoarea afișată este greșită (sau programul se strică). Marcajul trebuie să corespundă tipului: %zu pentru size_t.
  • Pui textul utilizatorului ca șablon: printf(text). Dacă textul conține %, se citesc argumente inexistente. Scrie printf("%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).