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

C++ How to convert string, which has string and numeric, into int or long

本文关键字:字符串 转换 int long 包含 C++ 数字      更新时间:2023-10-16

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

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

我已经确认i int100,并且省略了km。但是,如果我输入2147483648km,超过该int范围,i将有-2147483648

根据此页面,int应该能够拥有

–2,147,483,648 至 2,147,483,647

所以,我认为这个误差来自 int 的范围,但即使atoiatol 替换并且int被替换为 unsigned long 时,也会发生同样的错误,它可以具有更大的值。换句话说,将 int 替换为 long 并不能修复此错误。

我可能需要想出一种替代方法来转换这种字符串(即"______km"字符串转换为 int 变量(。

在某些编译器中,int并不比 long "少得多",而且它们确实相等。

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

一个简单的解决方案是使用atof,而是使用double在大多数平台上是一个 64 位 IEE754 双精度数字,能够准确地表示所有整数,最高可达 253 的量级,即9,007,199,254,740,992

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

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

此外,您应该切换到 stoistolstoll(或其无符号变体(而不是 atoi


如果你想知道一个类型的实际限制、大小和范围,你应该使用 std::numeric_limits .

数据类型

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

此外,atol返回一个long,所以如果你给它一个unsigned long你会得到一个长期的回报。

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

通过使用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

使用 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;