在C++中将字符串转换为数字

5

我看到很多将字符串转换为数字的选项,其中一些实际上推荐使用标准C函数,例如atoiatof

我没有看到有人建议以下选项,它完全依赖于C ++ STL:

int Str2Num(const string& str) // can be called with a 'char*' argument as well
{
    int num;
    istringstream(str)>>num;
    return num;
}

更普遍而言:

template <typename type>
type Str2Num(const string& str) // can be called with a 'char*' argument as well
{
    type num;
    istringstream(str)>>num;
    return num;
}

以上实现方式有哪些缺点?

是否有更简单/更清晰的方法来实现此转换?


3
如果这不是重复的话,我会非常惊讶。 - user2672165
请查看boost::lexical_cast: http://www.boost.org/doc/libs/1_55_0/doc/html/boost_lexical_cast.html - Messa
@user2672165,这是我问题中的第一句话:“我看到很多选项可以将字符串转换为C++中的数字”。这是我问题中的第三句话:“我没有看到有人建议以下选项,该选项仅依赖于C++ STL”。显然,我发布了这个问题,因为找不到符合“纯C++ STL”要求的答案。 - barak manos
@Ali,谢谢。关于“不要这样做”的部分很好,因为它直接涉及我的代码片段并回答了我对这种实现的缺点的问题。而“最佳解决方案”部分实际上 “退回” 到使用标准 C 函数,而在我的问题中,我(暗示地)希望避免使用它们。 - barak manos
@barakmanos 好的,这是上面链接问题的被接受答案。就让它保持这样吧。 - Ali
显示剩余9条评论
5个回答

9
自从C++11之后,我们就拥有了std::stoi函数(std::stoi):
std::stoi(str)

还有std::stolstd::stoll


太好了!这就是我说“有没有更简单/更清晰的方法来实现这种转换?”时想要的……stod用于double - barak manos
@barakmanos 是的,也有浮点数替代方案。点击此处了解更多信息。 - Joseph Mansfield

4
中,std::string类本身定义了许多数值转换函数:

数值转换
stoi (C++11)
stol (C++11)
stoll (C++11)

将字符串转换为有符号整数

stoul (C++11)
stoull (C++11)

将字符串转换为无符号整数

stof (C++11)
stod (C++11)
stold (C++11)

将字符串转换为浮点数

至于c++11之前的标准,我看不出你的模板函数示例有任何缺点。

1

#include <iostream>
#include <string>

int main() {

    std::string str = "123";
    int num;

    // using stoi() to store the value of str1 to x
    num = std::stoi(str);

    std::cout << num;

    return 0;
}


0
#include <sstream>
template <typename T>
inline bool StringToNumber(const std::string& sString, T &tX)
{
    std::istringstream iStream(sString);
    return !(iStream >> tX).fail();not
}

然后调用

double num{};
StringToNumber(std::string{"580.8"}, num);

float fnum{};
StringToNumber(std::string{"5e+1.0"}, fnum);

你的回答可以通过提供更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心找到有关如何编写良好答案的更多信息。 - Community
这如何回答OP提出的问题? - Abhishek Dutt
not in return !(iStream >> tX).fail(); means "not". It is used to negate the result of the expression (iStream >> tX).fail(). - kyb

0

你可以使用转换函数 Strtol() Strtoul() 然而在C++11中,以上问题都已解决。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接