Как перевести строку в число и обратно
#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) | число → строка |
Цифра-символ и число
Одна цифра переводится без функций — через коды символов:
#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. Если строка может быть неправильной, ловите исключения:
#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
-8number 15
not a number
too big
number -8try { ... } catch (...) { ... } — если внутри try случилась ошибка, выполнение переходит в подходящий блок catch, и программа продолжает работу.
Подводные камни
to_stringдля дробного числа всегда даёт 6 знаков после запятой:to_string(1.5)— это"1.500000". Чтобы вывести дробное красиво, выводите его прямо черезcout(как задать точность — в справке Как вывести число с нужной точностью).int('7')— не 7, а код символа, 55. Цифру даёт'7' - '0'.stoiдля числа больше 2 147 483 647 бросаетout_of_range— для больших чисел беритеstoll.- В старом коде встречается
atoi(s.c_str())из<cstdlib>: при ошибке она молча возвращает 0, и неправильные данные не отличить от настоящего нуля.