【发布时间】:2019-06-17 15:31:58
【问题描述】:
是否有安全标准方法可以将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 不能简单地插入/添加一个)。
现在,由于 C++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不会抛出任何东西。相反,它返回一个错误代码。
标签: c++ string c++17 atoi string-view