Как преобразовать массив символов char[] в int?
Есть массив символов, как преобразовать его в int?
char buffer[255] = "154306";
int a = buffer; //хочется чтобы переменная a была равна 154306
Ответы (2 шт):
Для преобразования C-строки в значение типа int есть по крайней мере следующие способы:
- Функция
std::atoi()
#include <cstdlib>
...
char buffer[256] = "12345";
int val = std::atoi(buffer);
cout << val;
Если не удалось преобразовать строку в число (пустая строка, или последовательность символов в строке не представляет число), то функция возвращает ноль.
Если строка содержит число, но оно не представимо типом int, то поведение функции не определено.
- Функция
std::sscanf()
#include <cstdio>
...
char buffer[256] = "12345";
int val = 0;
int result = std::sscanf(buffer, "%d", &val);
if (result == EOF) {
//Входная строка пустая
} else if (result == 0) {
//Не удалось преобразовать строку в число
} else {
cout << val;
}
Если строка содержит число, но оно не представимо типом int, то поведение функции не определено.
- Функция
std::strtol()
#include <cstdlib>
#include <cerrno>
#include <limits>
...
char buffer[256] = "12345";
char* buffer_end = nullptr;
int saved_errno = errno;
errno = 0;
long lval = strtol(buffer, &buffer_end, 10);
int cur_errno = errno;
errno = saved_errno;
if (buffer == buffer_end) {
//Не удалось преобразовать строку в число
} else if (cur_errno != 0) {
//Переполнение при преобразовании в число
} else if (lval < std::numeric_limits<int>::min() || lval > std::numeric_limits<int>::max()) {
//Переполнение при преобразовании в число
} else {
int val = static_cast<int>(lval);
cout << val;
}
std::string+ функцияstd::stoi().
#include <string>
#include <stdexcept>
...
char buffer[256] = "12345";
try {
int val = std::stoi(std::string(buffer));
cout << val;
} catch (const std::invalid_argument& e) {
//Не удалось преобразовать строку в число
} catch (const std::out_of_range& e) {
//Переполнение при преобразовании в число
}
#include <sstream>
...
char buffer[256] = "12345";
int val = 0;
std::stringstream stream;
stream << buffer;
stream >> val;
if (stream.fail()) {
//Либо не удалось преобразовать строку в число
//Либо переполнение при преобразовании в число
} else {
cout << val;
}
- Функция
std::from_chars()
#include <charconv>
#include <system_error>
#include <cstring>
...
char buffer[256] = "12345";
int val = 0;
auto res = std::from_chars(buffer, buffer + std::strlen(buffer), val);
if (res.ec == static_cast<std::errc>(0)) {
cout << val;
} else if (res.ec == std::errc::invalid_argument) {
//Не удалось преобразовать строку в число
} else if (res.ec == std::errc::result_out_of_range) {
//Переполнение при преобразовании в число
}
std::from_chars() — единственная из представленных функций, на которую не влияют текущие глобальные локали. Но в отличие от других способов, данная функция не игнорирует ведущие пробельные символы в строке. Также неотрицательные числа не могут начинаться с символа +.