Глиф Учебники

Как перевести строку в число и обратно

Справочник · C++ · 1 минута чтения

C++
#include <iostream>
#include <string>
using namespace std;

int main() {
    string s = "123";
    int n = stoi(s);                // строка → int
    cout << n + 1 << "\n";
    string t = to_string(n * 2);    // число → строка
    cout << t + "!" << "\n";
    long long big = stoll("9000000000");
    cout << big / 1000 << "\n";
    double d = stod("2.5");         // строка → double
    cout << d * 2 << "\n";
    return 0;
}
Вывод
124
246!
9000000
5

Все эти функции — из <string>:

ФункцияЧто делает
stoi(s)строка → int
stoll(s)строка → long long
stod(s)строка → double
to_string(x)число → строка

Цифра-символ и число

Одна цифра переводится без функций — через коды символов:

C++
#include <iostream>
#include <string>
using namespace std;

int main() {
    string s = "2024";
    int sum = 0;
    for (char c : s) {
        sum += c - '0';             // '7' - '0' == 7
    }
    cout << sum << "\n";
    char c = '0' + 5;               // 5 → '5'
    cout << c << "\n";
    return 0;
}
Вывод
8
5

Если в строке не число

stoi пропускает пробелы в начале и читает цифры, пока они есть. stoi("42abc") вернёт 42, а stoi("abc") не может прочитать ничего и бросает исключение (сообщает об ошибке; если её не обработать, программа останавливается) — программа падает с сообщением terminate called after throwing an instance of 'std::invalid_argument'. Слишком большое для int число даёт исключение std::out_of_range. Если строка может быть неправильной, ловите исключения:

C++
#include <iostream>
#include <string>
#include <stdexcept>
using namespace std;

int main() {
    string line;
    while (getline(cin, line)) {
        try {
            int x = stoi(line);
            cout << "number " << x << "\n";
        } catch (const invalid_argument&) {
            cout << "not a number\n";
        } catch (const out_of_range&) {
            cout << "too big\n";
        }
    }
    return 0;
}
Ввод
15
hello
99999999999
-8
Вывод
number 15
not a number
too big
number -8

try { ... } catch (...) { ... } — если внутри try случилась ошибка, выполнение переходит в подходящий блок catch, и программа продолжает работу.

Подводные камни