免责声明:链接指向cppreference.com
所以我早就知道std::atoi已被弃用,建议改用std::strtol。
C ++ 11引入了std::stoi,我试图理解为什么会选择在std::strtol
上使用它。
据我所知,stoi调用strtol但抛出异常。它还返回一个整数而不是long。
这些主要区别是什么,我缺少什么?
答案 0 :(得分:7)
这些主要区别是什么,我缺少什么?
较新的std::stoi
也可以直接从std::string
开始工作(因此您无需使用.c_str()
次调用来丢弃代码),并可选择为您提供第一个不匹配的字符< em> index 通过size_t
,而不是指针。
这些更改简化了代码中的使用。
答案 1 :(得分:2)
一个很大的区别是stoi
需要std::string
作为参数,因此您不必将.c_str()
添加到字符串上以将其转换为整数。
如果您想转换为long
,则可以使用stol
代替stod
,stof
stold
,{{1} },stoul
分别转换为stoll
double,
,float
,long double
和unsigned long
。
答案 2 :(得分:2)
如果您想传递std::stoi()
并希望获得std::basic_string
,则可以使用int
。如果您希望获得long
,请拨打std::stol()
。
答案 3 :(得分:1)
我更喜欢stoi()而不是strtol()因为前者在无效输入上抛出std :: invalid_argument。更糟糕的是GNU libstdc ++中的异常消息并没有帮助。例如:“what():stoi”
答案 4 :(得分:0)
std:stoi
不兼容C并且包含<string>
库,其中包含其他面向对象的实现,无法由C编译器编译。它的主要用例场景(应该)涉及std:string而不是字节数组,以符合现代C ++的常规做法。
答案 5 :(得分:-2)
实际上,我真的很想知道为什么没有std :: FromString模板函数将您希望字符串转换为的类型作为模板参数。同样,ToString模板函数也是如此。
您可以使用插入和提取运算符轻松想象实现。
int i = std::FromString <int> (std::string ("2"))
int j = std::FromString <int> ("2")
std::string = ToString <double> (3.14159)
是的,当然函数名称没有大写字母,它们可能是from_string和to_string。
当然,模板专业化是可能的。 最后,确实没有类型必须是本机类型的限制,对吧?