std::to_chars în C++

Scrie un număr ca text într-un tablou de char, foarte rapid, fără alocări și fără excepții.

Sintaxă
#include <charconv>
std::to_chars_result to_chars(char* inceput, char* sfarsit, int valoare, int baza = 10);
std::to_chars_result to_chars(char* inceput, char* sfarsit, double valoare);
std::to_chars_result to_chars(char* inceput, char* sfarsit, double valoare, std::chars_format format, int precizie);

Ce face std::to_chars

std::to_chars scrie cifrele unui număr în zona [inceput, sfarsit). Nu alocă memorie, nu depinde de setările de limbă (locale) și nu aruncă excepții, de aceea este cea mai rapidă conversie număr–text din C++.

Rezultatul are două câmpuri: ptr (unde s-a terminat textul scris) și ec (cod de eroare; std::errc{} înseamnă succes, std::errc::value_too_large înseamnă că nu a încăput). Nu se adaugă '\0'.

Pentru numere reale, fără format se scrie forma cea mai scurtă care, citită înapoi, dă exact același număr (0.1, nu 0.100000). Cu std::chars_format::fixed și o precizie alegi numărul de zecimale.

Parametri

Parametru Descriere
inceput, sfarsit Zona de memorie în care se scrie.
valoare Numărul convertit.
baza Pentru întregi: baza (2–36).
format, precizie Pentru numere reale: fixed, scientific, general, hex, cu numărul de zecimale.

Ce returnează

Un std::to_chars_result cu câmpurile ptr și ec.

Exemple

Exemplul 1: Întregi și numere reale

#include <charconv>
#include <iostream>
#include <string_view>

int main() {
    char buf[32];

    auto r = std::to_chars(buf, buf + sizeof(buf), 2026);
    std::cout << std::string_view(buf, r.ptr) << '\n';

    r = std::to_chars(buf, buf + sizeof(buf), 255, 2);
    std::cout << std::string_view(buf, r.ptr) << '\n';

    r = std::to_chars(buf, buf + sizeof(buf), 0.1);
    std::cout << std::string_view(buf, r.ptr) << '\n';

    r = std::to_chars(buf, buf + sizeof(buf), 1299.456, std::chars_format::fixed, 2);
    std::cout << std::string_view(buf, r.ptr) << '\n';
}

Rezultat

2026
11111111
0.1
1299.46

Exemplul 2: Spațiu insuficient

#include <charconv>
#include <iostream>
#include <system_error>

int main() {
    char mic[4];
    auto r = std::to_chars(mic, mic + sizeof(mic), 1234567);
    if (r.ec == std::errc::value_too_large) {
        std::cout << "Numărul nu încape în 4 caractere\n";
    }
}

Rezultat

Numărul nu încape în 4 caractere

Greșeli frecvente

  • Folosești tabloul ca șir C după to_chars: nu există '\0' la final. Folosește std::string_view(buf, r.ptr) sau pune terminatorul la r.ptr.
  • Nu verifici r.ec: dacă tabloul este prea mic, conținutul lui nu are sens.

Comenzi înrudite

  • std::from_chars: Citește un număr dintr-un text, foarte rapid, fără excepții, cu raport exact despre erori.
  • std::to_string: Transformă un număr în std::string, de exemplu 42 în „42”.
  • std::format: Construiește un std::string dintr-un șablon cu acolade {} și valori (C++20).
  • std::snprintf: Scrie text formatat ca printf într-un tablou de char, fără să-i depășească mărimea.