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

What are the differences between std::strtol and std::stoi?

本文关键字:std 什么 区别 strtol stoi      更新时间:2023-10-16

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

所以我知道 std::atoi 已经被弃用了一段时间,建议使用 std::strtol 代替。

C++11 引入了 std::stoi,我试图理解为什么人们会选择使用它而不是std::strtol

据我了解,stoi 调用 strtol 但会抛出异常。 此外,它还返回一个整数而不是一个长整型。

这些是主要区别吗,我错过了什么?

这些是主要区别吗,我错过了什么?

较新的std::stoi也可以直接从std::string工作(因此您不必用.c_str()调用乱扔代码(,并且可以选择通过size_t为您提供第一个不匹配的字符作为索引,而不是作为指针。

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

一个很大的区别是stoistd::string作为其参数,因此您不必将.c_str()附加到字符串上即可将其转换为整数。

如果要转换为long,则可以改用stol(同样,stodstof stoldstoulstoll分别转换为double, floatlong doubleunsigned longlong long(。

如果你想

通过一个std::basic_string并且你想得到一个int,你会使用std::stoi()。如果你喜欢出去long你会打电话给std::stol()

我更喜欢stoi((而不是strtol((,因为前者在无效输入上抛出std::invalid_argument。坏GNUs libstdc++中的异常消息是没有帮助的。例如:"what((: stoi">

std:stoi

C不兼容,并且包含<string>库,该库具有其他无法由C编译器编译的面向对象的实现。它的主要用例场景(应该(涉及使用std:string而不是字节数组,以符合现代C++常见的做法。

实际上,我真的很想知道为什么没有一个 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。

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