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::stoiaruncăstd::invalid_argumentși programul se oprește. - Crezi că
stoi("12abc")dă eroare: întoarce 12 și ignoră restul. Verifică parametrulpozitiedacă tot textul trebuie să fie număr. std::stoul("-1")nu dă eroare: minusul este acceptat și rezultatul este cel mai mareunsigned 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.