C++ C++;如何将包含字符串和数字的字符串转换为int或long
我正在尝试将包含字母和数字值的字符串变量转换为int变量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
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;