C++如何将包含字符串和数字的字符串转换为int或long
C++ How to convert string, which has string and numeric, into int or long
我正在尝试将包含字母和数字值的字符串变量转换为 int 变量。
string argument = "100km";
int i = atoi(argument.c_str());
cout<<i<<endl;
我已经确认 i
的 int
为 100
并且省略了 km
。
但是,如果我输入 2147483648km
,超出 int
的范围,i
将有 -2147483648
.
According to this page, int
应该可以有
–2,147,483,648 to 2,147,483,647
所以,我认为这个错误来自 int
的范围,但是即使 atoi
被 atol
替换并且 int
是替换为 unsigned long
,它可以具有更大的值。换句话说,将 int 替换为 long 并不能解决此错误。
可能我需要想出另一种方法来将这种字符串(即“______km”的字符串转换为 int 变量)。
在一些编译器中 int
并不比 "much less" 长,实际上它们是相等的。
标准为您提供的唯一保证是 long
绝不会 小于 int
。
一个简单的解决方案是使用 atof
而不是使用 double
s,在大多数平台上它是一个 64 位 IEE754 双精度数,能够精确地表示所有整数253 的量级,即 9,007,199,254,740,992
.
基本整数类型的大小和范围取决于编译器。在 32 位平台上,几乎所有编译器都只有 32 位 int
和 long
类型。在 64 位平台上,Visual Studio 编译器 still 具有 32 位 int
和 long
而例如GCC 有 32 位 int
和 64 位 long
.
如果你想要更大的类型,那么你需要 long long
,它目前在所有平台和编译器上都是 64 位的(尽管它不一定是)。
此外,您应该切换到 stoi
, stol
and stoll
(or their unsigned variants) 而不是 atoi
。
如果你想知道一个类型的实际限制、大小和范围,你应该使用 std::numeric_limits
。
通过使用strtol
你可以得到你想要的:
string argument = "2147483648km";
char *end;
std::cout<<strtol(static_cast<const char *> (argument.c_str()),&end,10);
取决于尺码,您可以选择 stol
、stoll
或 stoi
。此处提供更多详细信息:http://en.cppreference.com/w/cpp/string/byte/strtol
数据类型范围从 Microsoft 的站点可以向您展示 Visual C++ 编译器使用的内容。
这可能会有所不同,请参阅 6502 的回答。
此外,atol
return 是一个 long
,所以如果你给它一个 unsigned long
,你将在 return 中得到一个长。
自 C++11 起,您可以使用 atoll
,其中 return 是 long long
,否则请使用 stoi, stol, stoll
.[=17= 查看其他答案]
使用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;
我正在尝试将包含字母和数字值的字符串变量转换为 int 变量。
string argument = "100km";
int i = atoi(argument.c_str());
cout<<i<<endl;
我已经确认 i
的 int
为 100
并且省略了 km
。
但是,如果我输入 2147483648km
,超出 int
的范围,i
将有 -2147483648
.
According to this page, int
应该可以有
–2,147,483,648 to 2,147,483,647
所以,我认为这个错误来自 int
的范围,但是即使 atoi
被 atol
替换并且 int
是替换为 unsigned long
,它可以具有更大的值。换句话说,将 int 替换为 long 并不能解决此错误。
可能我需要想出另一种方法来将这种字符串(即“______km”的字符串转换为 int 变量)。
在一些编译器中 int
并不比 "much less" 长,实际上它们是相等的。
标准为您提供的唯一保证是 long
绝不会 小于 int
。
一个简单的解决方案是使用 atof
而不是使用 double
s,在大多数平台上它是一个 64 位 IEE754 双精度数,能够精确地表示所有整数253 的量级,即 9,007,199,254,740,992
.
基本整数类型的大小和范围取决于编译器。在 32 位平台上,几乎所有编译器都只有 32 位 int
和 long
类型。在 64 位平台上,Visual Studio 编译器 still 具有 32 位 int
和 long
而例如GCC 有 32 位 int
和 64 位 long
.
如果你想要更大的类型,那么你需要 long long
,它目前在所有平台和编译器上都是 64 位的(尽管它不一定是)。
此外,您应该切换到 stoi
, stol
and stoll
(or their unsigned variants) 而不是 atoi
。
如果你想知道一个类型的实际限制、大小和范围,你应该使用 std::numeric_limits
。
通过使用strtol
你可以得到你想要的:
string argument = "2147483648km";
char *end;
std::cout<<strtol(static_cast<const char *> (argument.c_str()),&end,10);
取决于尺码,您可以选择 stol
、stoll
或 stoi
。此处提供更多详细信息:http://en.cppreference.com/w/cpp/string/byte/strtol
数据类型范围从 Microsoft 的站点可以向您展示 Visual C++ 编译器使用的内容。
这可能会有所不同,请参阅 6502 的回答。
此外,atol
return 是一个 long
,所以如果你给它一个 unsigned long
,你将在 return 中得到一个长。
自 C++11 起,您可以使用 atoll
,其中 return 是 long long
,否则请使用 stoi, stol, stoll
.[=17= 查看其他答案]
使用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;