std::atoi în C++

Transformă un text C în număr întreg (atoi) sau cu virgulă (atof), fără nicio semnalare a erorilor.

Sintaxă
int atoi(const char* text);
double atof(const char* text);

Ce face std::atoi

std::atoi citește un număr întreg de la începutul textului, sărind peste spațiile inițiale și oprindu-se la primul caracter care nu face parte din număr. std::atof face același lucru pentru numere cu virgulă (cu punct zecimal).

Problema lor: dacă textul nu conține un număr, returnează 0, la fel ca pentru textul „0”, deci nu poți ști dacă a fost o eroare. Dacă numărul nu încape în int, comportamentul este nedefinit. În C++ modern folosește std::stoi/std::stod (aruncă excepții) sau std::from_chars.

Parametri

Parametru Descriere
text Un șir C terminat cu '\0' (pentru std::string folosește s.c_str()).

Ce returnează

Numărul citit sau 0 dacă nu s-a putut citi nimic.

Exemple

Exemplul 1: Ce citește atoi

#include <cstdlib>
#include <print>

int main() {
    std::println("atoi(\"42\")      = {}", std::atoi("42"));
    std::println("atoi(\"  -17 kg\") = {}", std::atoi("  -17 kg"));
    std::println("atoi(\"12abc\")   = {}", std::atoi("12abc"));
    std::println("atoi(\"abc\")     = {}", std::atoi("abc"));
    std::println("atoi(\"0\")       = {}", std::atoi("0"));
}

Rezultat

atoi("42")      = 42
atoi("  -17 kg") = -17
atoi("12abc")   = 12
atoi("abc")     = 0
atoi("0")       = 0

Exemplul 2: atof și argumentele din linia de comandă

Argumentele primite de main sunt texte C; aici le simulăm cu un tablou.

#include <cstdlib>
#include <print>
#include <string>

int main() {
    const char* argumente[] = {"program", "3", "19.99"};

    int bucati = std::atoi(argumente[1]);
    double pret = std::atof(argumente[2]);
    std::println("Total: {:.2f} lei", bucati * pret);

    std::string text = "2.5e3";
    std::println("atof(\"2.5e3\") = {}", std::atof(text.c_str()));
}

Rezultat

Total: 59.97 lei
atof("2.5e3") = 2500

Greșeli frecvente

  • Validezi datele introduse de utilizator cu atoi: „abc” devine 0 fără niciun semnal. Folosește std::stoi într-un try sau std::from_chars.
  • Dai lui atof un număr cu virgulă românească („19,99”): citește doar 19.

Comenzi înrudite

  • std::div: Calculează într-un singur apel câtul și restul împărțirii a două numere întregi.
  • std::getenv: Citește valoarea unei variabile de mediu (de exemplu HOME sau PATH); returnează nullptr dacă nu există.
  • std::stoi: Transformă un text în număr întreg (int, long, long long, unsigned long), cu excepții la erori.