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
。
根据此页面,int
应该能够拥有
–2,147,483,648 至 2,147,483,647
所以,我认为这个误差来自 int
的范围,但即使atoi
被 atol
替换并且int
被替换为 unsigned long
时,也会发生同样的错误,它可以具有更大的值。换句话说,将 int 替换为 long 并不能修复此错误。
我可能需要想出一种替代方法来转换这种字符串(即"______km"字符串转换为 int 变量(。
在某些编译器中,int
并不比 long "少得多",而且它们确实相等。
标准为您提供的唯一保证是long
永远不会小于int
。
一个简单的解决方案是使用atof
,而是使用double
在大多数平台上是一个 64 位 IEE754 双精度数字,能够准确地表示所有整数,最高可达 253 的量级,即9,007,199,254,740,992
。
基本整数类型的大小和范围取决于编译器。在 32 位平台上,几乎所有编译器都只有 32 位int
和long
类型。在64位平台上,Visual Studio编译器仍然具有32位int
和long
,而例如GCC具有32位int
和64位long
。
如果你想要一个更大的类型,那么你需要long long
目前在所有平台和编译器上都是64位(尽管它不一定是(。
此外,您应该切换到 stoi
、 stol
和 stoll
(或其无符号变体(而不是 atoi
。
如果你想知道一个类型的实际限制、大小和范围,你应该使用 std::numeric_limits
.
范围来自Microsoft的网站可以显示Visual C++编译器使用的内容。
这可能会有所不同,请参阅6502的答案。
此外,atol
返回一个long
,所以如果你给它一个unsigned long
你会得到一个长期的回报。
从 C++11 开始,您可以使用返回long long
的atoll
,否则使用 stoi, stol, stoll
查看其他答案。
通过使用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
使用 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;
- 如何将包含epoch时间的十六进制字符串转换为time_t
- 当字符串存储在变量中时,如何将字符串转换为wchar_t
- 如何将这个std::字符串转换为std::基本字符串
- 如何正确将字符串转换为标准::时间::system_clock::time_point?
- 如何在C++中将十六进制字符串转换为文本数据
- 需要帮助在 c++ 中将字符串转换为字符 ----错误 "const char *" 类型的值不能用于初始化 "char" 类型的实体
- 如何从字符串转换为双精度*
- C++:如何将 unix 时间的字符串转换为 *tm?(使用时间错误:"cannot convert 'String' to 'tm*' ")
- 如何在C++中将 Python 字符串转换为其转义版本?
- 如何在 C++11 中将标准::字符串转换为标准::u32字符串?
- 如何将整数字符串转换为整数的二维向量?
- 使用 "stringstream " 将字符串转换为整数
- 将字符串转换为浮点数或整数,而无需使用内置函数(如 atoi 或 atof)
- 将文件复制到自定义位置,存在字符串转换问题
- 将ANSI C字符串转换为UNICODE
- 如何将节点 V8 字符串转换为 C++ 字符串
- 在C++中将字符串转换为双精度,而无需科学记数法
- 使用从文件(stod、strtod、atof)中提取的数据C++从字符串转换为双精度.csv
- 如何在C++中将字符串转换为双精度?
- 将字符串转换为无符号字符数组/字节数组