std :: strtol和std :: stoi有什么区别?

时间:2013-10-08 22:47:34

标签: c++ c++11

免责声明:链接指向cppreference.com

所以我早就知道std::atoi已被弃用,建议改用std::strtol

C ++ 11引入了std::stoi,我试图理解为什么会选择在std::strtol上使用它。

据我所知,stoi调用strtol但抛出异常。它还返回一个整数而不是long。

这些主要区别是什么,我缺少什么?

6 个答案:

答案 0 :(得分:7)

  

这些主要区别是什么,我缺少什么?

较新的std::stoi也可以直接从std::string开始工作(因此您无需使用.c_str()次调用来丢弃代码),并可选择为您提供第一个不匹配的字符< em> index 通过size_t,而不是指针。

这些更改简化了代码中的使用。

答案 1 :(得分:2)

一个很大的区别是stoi需要std::string作为参数,因此您不必将.c_str()添加到字符串上以将其转换为整数。

如果您想转换为long,则可以使用stol代替stodstof stold,{{1} },stoul分别转换为stoll double,floatlong doubleunsigned 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。

当然,模板专业化是可能的。 最后,确实没有类型必须是本机类型的限制,对吧?