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

C++ C++;如何将包含字符串和数字的字符串转换为int或long,c++,string,atoi,C++,String,Atoi,我正在尝试将包含字母和数字值的字符串变量转换为int变量 string argument = "100km"; int i = atoi(argument.c_str()); cout<<i<<endl; string参数=“100km”; inti=atoi(argument.c_str()); cout在某些编译器中,int并不比long“小得多”,实际上它们是相等的 标准给您的唯一保证是long永远不会小于int 一个简单的解决方案是使用atof而不是使用doub

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

string argument = "100km";
int i = atoi(argument.c_str());
cout<<i<<endl;
string参数=“100km”;
inti=atoi(argument.c_str());

cout在某些编译器中,int
并不比long“小得多”,实际上它们是相等的

标准给您的唯一保证是
long
永远不会小于
int


一个简单的解决方案是使用
atof
而不是使用
double
s,在大多数平台上,它是一个64位IEE754双精度数,能够精确表示253量级的所有整数,即
9007199254740992

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

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

此外,您应该切换到(或其)而不是
atoi



如果你想知道一种类型的实际限制、大小和范围,你应该使用。

通过使用
strtol
你可以实现你想要的:

    string argument = "2147483648km";
    char *end;
    std::cout<<strtol(static_cast<const char *> (argument.c_str()),&end,10);
string参数=“2147483648km”;
字符*结束;
STD::CUT< P>从S站点的数据类型范围可以显示VisualC++编译器使用的内容。br>这可能有所不同,请参见6502的答案

此外,
atol
返回一个
long
,因此如果您给它一个
无符号long
,您将得到一个long作为回报


从C++11开始,您可以使用
atol
,它返回一个
long
,否则可以使用
stoi、stol、stoll
使用
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";
        }
}

感谢您在
long
上引用了永不小于
int
的标准。根据您链接的页面,
long
也有
–2147483648到2147483647
(在该平台上)…除了数据类型限制之外,我将使用sscanf进行这种类型的字符串解析,而不是atoi/atol。多才多艺。非常感谢大家。使用
atoll
long
似乎是最适合我的案例的选择,但其他观点也非常受欢迎,而且信息丰富。
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;