Существует ли безопасный стандартный способ преобразования std::string_view
в int
?
Поскольку C++11 std::string
позволяет нам использовать stoi
для преобразования в int
:
std::string str = "12345";
int i1 = stoi(str); // Works, have i1 = 12345
int i2 = stoi(str.substr(1,2)); // Works, have i2 = 23
try {
int i3 = stoi(std::string("abc"));
}
catch(const std::exception& e) {
std::cout << e.what() << std::endl; // Correctly throws 'invalid stoi argument'
}
Но stoi
не поддерживает std::string_view
. В качестве альтернативы мы могли бы использовать atoi
, но нужно быть очень осторожным, например:
std::string_view sv = "12345";
int i1 = atoi(sv.data()); // Works, have i1 = 12345
int i2 = atoi(sv.substr(1,2).data()); // Works, but wrong, have i2 = 2345, not 23
Таким образом, atoi
тоже не работает, так как он основан на нулевом терминаторе '\0'
(и, например, sv.substr
не может просто вставить/добавить его).
Теперь, начиная с С++ 17, есть также from_chars
, но, похоже, он не выдает ошибки при вводе неверных данных:
try {
int i3;
std::string_view sv = "abc";
std::from_chars(sv.data(), sv.data() + sv.size(), i3);
}
catch (const std::exception& e) {
std::cout << e.what() << std::endl; // Does not get called
}
std::from_chars
ничего не генерирует. Вместо этого он возвращает код ошибки. - person Yksisarvinen   schedule 17.06.2019