C ++如何将包含字符串和数字的字符串转换为int或long

时间:2015-06-09 08:34:44

标签: c++ string atoi

我正在尝试将包含字母和数字值的字符串变量转换为int变量。

string argument = "100km";
int i = atoi(argument.c_str());
cout<<i<<endl;

我已确认i int 100km被省略。 但是,如果我输入的2147483648km超出int范围,i-2147483648

According to this page, int应该能够拥有

  

-2,147,483,648至2,147,483,647

所以,我认为此错误来自int的范围,但即使atoi替换为atol并且int被替换为unsigned long,也会发生同样的错误$scope.allimages = [{ 'src' : 'img/home1.png' }, { 'src' : 'img/home2.png' }, { 'src' : 'img/home3.png' },{ 'src' : 'img/home4.png' }]; ,可以有更大的价值。换句话说,用long替换int不会解决此错误。

有可能我需要提出另一种方法来转换这种字符串(即字符串“______km”到一个int变量)。

5 个答案:

答案 0 :(得分:4)

在某些编译器中,int并非“长得多”,实际上它们是相同的。

标准为您提供的唯一保证是long永远不会小于

一个简单的解决方案是使用int代替使用atof s,它在大多数平台上都是64位IEE754双精度数,它能够精确地表示所有整数2 53 double

答案 1 :(得分:2)

基本整数类型的大小和范围取决于编译器。在32位平台上,几乎所有编译器都只有32位intlong类型。在64位平台上,Visual Studio编译器仍然具有32位intlong,例如GCC具有32位int和64位long

如果你想要一个更大的类型,那么你需要long long,目前在所有平台和编译器上都是64位(尽管它不一定是这样)。

此外,您应该切换到stoi, stol and stoll(或他们的unsigned variants)而不是atoi

如果您想知道某种类型的实际限制,大小和范围,请使用std::numeric_limits

答案 2 :(得分:1)

Microsoft网站的数据类型范围可以显示Visual C ++编译器使用的内容。
这可能会有所不同,请参阅6502的回答。

此外,atol会返回long,因此,如果您给它unsigned long,那么您将获得很长的回报。

从C ++ 11开始,您可以使用atoll返回long long,否则请使用stoi, stol, stoll查看其他答案。

答案 3 :(得分:0)

使用strtol可以实现您的目标:

    string argument = "2147483648km";
    char *end;
    std::cout<<strtol(static_cast<const char *> (argument.c_str()),&end,10);

取决于尺寸,您可以选择stolstollstoi。有关详细信息,请访问:http://en.cppreference.com/w/cpp/string/byte/strtol

答案 4 :(得分:0)

使用std::stringstream

#include <sstream>
#include <iostream>
#include <string>
using namespace std;

int main()
{
        std::stringstream ss { "2147483648km" };
        int n;
        string s;

        if (!(ss >> n ))
        {
                std::cout << "cannot convert \n";
        }
        else
        {
                ss >> s ;
                std::cout << n << " " << s << "\n";
        }
}

你甚至可以抽象整个事情

struct Distance
{
    string unit; 
    int distance;

    friend istream& operator>>(istream& in, Distance &d)
    {
         return in >> distance >> unit;
    }

};

std::stringstream ss { "331104km" };
Distance dst;
ss >> dst;