std::snprintf în C++

Scrie text formatat ca printf într-un tablou de char, fără să-i depășească mărimea.

Sintaxă
#include <cstdio>
int snprintf(char* destinatie, std::size_t marime, const char* format, ...);

Ce face std::snprintf

snprintf formatează la fel ca printf, dar pune rezultatul în tabloul destinatie. Scrie cel mult marime - 1 caractere și pune mereu '\0' la final, deci nu depășește tabloul.

Returnează lungimea pe care ar fi avut-o textul complet. Dacă valoarea este mai mare sau egală cu marime, textul a fost tăiat. Cu destinatie = nullptr și marime = 0 afli doar câte caractere ar fi necesare.

Parametri

Parametru Descriere
destinatie Tabloul în care se scrie.
marime Mărimea tabloului, inclusiv locul pentru '\0'.
format, ... Șablonul și valorile, ca la printf.

Ce returnează

Lungimea textului complet (fără '\0'), chiar dacă a fost tăiat.

Exemple

Exemplul 1: Un nume de fișier construit cu numere

#include <cstdio>

int main() {
    char nume_fisier[32];
    for (int luna = 8; luna <= 10; ++luna) {
        std::snprintf(nume_fisier, sizeof(nume_fisier), "raport_2026_%02d.csv", luna);
        std::puts(nume_fisier);
    }
}

Rezultat

raport_2026_08.csv
raport_2026_09.csv
raport_2026_10.csv

Exemplul 2: Text tăiat în siguranță

#include <cstdio>

int main() {
    char mic[16];
    int necesar = std::snprintf(mic, sizeof(mic), "Total: %.2f lei", 1299.5);
    std::printf("[%s] necesar %d, încăput %zu\n", mic, necesar, sizeof(mic) - 1);
    if (necesar >= static_cast<int>(sizeof(mic))) {
        std::printf("Textul a fost tăiat\n");
    }
}

Rezultat

[Total: 1299.50 ] necesar 18, încăput 15
Textul a fost tăiat

Greșeli frecvente

  • Folosești sprintf (fără n): nu știe mărimea tabloului și îl poate depăși. Pe macOS este chiar marcată ca învechită.
  • Ignori valoarea returnată și nu observi că textul a fost tăiat.

Comenzi înrudite

  • std::printf: Afișează text formatat în stil C, cu marcaje precum %d, %s, %.2f.
  • std::format_to: Scrie textul formatat direct într-un iterator de ieșire, de exemplu la finalul unui șir.
  • std::to_chars: Scrie un număr ca text într-un tablou de char, foarte rapid, fără alocări și fără excepții.
  • std::strcpy: Copiază (strcpy, strncpy) sau lipește (strcat) șiruri C în tablouri de char.