std::stoi în C++

Transformă un text în număr întreg (int, long, long long, unsigned long), cu excepții la erori.

Sintaxă
#include <string>
int stoi(const std::string& text, std::size_t* pozitie = nullptr, int baza = 10);
long stol(...);
long long stoll(...);
unsigned long stoul(...);

Ce face std::stoi

std::stoi("42") returnează numărul 42. Sare peste spațiile de la început, acceptă semn și citește cifre cât poate; restul textului este ignorat ("12kg" dă 12). Prin parametrul pozitie afli unde s-a oprit.

Familia are câte o funcție pentru fiecare tip: stoi (int), stol (long), stoll (long long), stoul (unsigned long). Parametrul baza permite citirea în baza 2, 8, 16 etc.; cu 0, baza se deduce din prefix (0x, 0).

Dacă textul nu începe cu un număr, se aruncă std::invalid_argument; dacă numărul nu încape în tip, std::out_of_range. Pentru conversii rapide, fără excepții, există std::from_chars.

Parametri

Parametru Descriere
text Textul de convertit.
pozitie Opțional: pointer în care se scrie numărul de caractere folosite.
baza Opțional: baza numerică (implicit 10).

Ce returnează

Numărul citit. Aruncă std::invalid_argument sau std::out_of_range.

Exemple

Exemplul 1: Conversii simple

#include <iostream>
#include <string>

int main() {
    std::cout << std::stoi("42") + 8 << '\n';
    std::cout << std::stoi("  -15 grade") << '\n';
    std::cout << std::stoll("9000000000") << '\n';
    std::cout << std::stoul("4000000000") << '\n';
    std::cout << std::stoi("ff", nullptr, 16) << ' ' << std::stoi("1010", nullptr, 2) << '\n';

    std::size_t poz;
    int kg = std::stoi("12kg", &poz);
    std::cout << kg << ", s-a oprit la poziția " << poz << '\n';
}

Rezultat

50
-15
9000000000
4000000000
255 10
12, s-a oprit la poziția 2

Exemplul 2: Tratarea erorilor

#include <iostream>
#include <stdexcept>
#include <string>

int main() {
    for (std::string text : {"2026", "abc", "99999999999"}) {
        try {
            int n = std::stoi(text);
            std::cout << text << " -> " << n << '\n';
        } catch (const std::invalid_argument&) {
            std::cout << text << " -> nu este un număr\n";
        } catch (const std::out_of_range&) {
            std::cout << text << " -> prea mare pentru int\n";
        }
    }
}

Rezultat

2026 -> 2026
abc -> nu este un număr
99999999999 -> prea mare pentru int

Exemplul 3: Verificarea că tot textul este număr

#include <iostream>
#include <string>

bool este_intreg(const std::string& s) {
    try {
        std::size_t poz;
        [[maybe_unused]] int valoare = std::stoi(s, &poz);   // ne interesează doar poz
        return poz == s.size();
    } catch (...) {
        return false;
    }
}

int main() {
    for (std::string s : {"123", "123abc", "", "-7"}) {
        std::cout << "\"" << s << "\": " << (este_intreg(s) ? "da" : "nu") << '\n';
    }
}

Rezultat

"123": da
"123abc": nu
"": nu
"-7": da

Greșeli frecvente

  • Nu prinzi excepțiile: dacă utilizatorul scrie text, std::stoi aruncă std::invalid_argument și programul se oprește.
  • Crezi că stoi("12abc") dă eroare: întoarce 12 și ignoră restul. Verifică parametrul pozitie dacă tot textul trebuie să fie număr.
  • std::stoul("-1") nu dă eroare: minusul este acceptat și rezultatul este cel mai mare unsigned long.

Comenzi înrudite

  • std::stod: Transformă un text într-un număr real: stod în double, stof în float.
  • 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::istringstream: Flux de citire dintr-un șir: desparte un text în cuvinte, numere sau câmpuri.