一、string转long类型
将string转换为long类型的最简单的方法是使用stol()函数。stol()函数将字符串参数解析为long。
#include
using namespace std;
int main()
{
string str = "123456789";
long num1 = stol(str);
cout << "num1 = " << num1 << endl;
return 0;
}
在上面的示例中,我们将字符串"123456789"转换成了long类型的数字,输出结果为:
num1 = 123456789
二、带小数的string转long
如果要将带小数的字符串转换为long类型,则需要进行一定的处理。我们可以从两个方面来处理带小数的字符串:
1.将小数点之后的部分截断
可以使用C++强制转换将字符串转换成int类型,然后再转换成long类型。这种方法会截断小数点之后的部分,只留下整数部分。
#include
using namespace std;
int main()
{
string str = "1234.56";
int num1 = static_cast<int>(stof(str));
long num2 = static_cast
(num1);
cout << "num2 = " << num2 << endl;
return 0;
}
在上面的示例中,我们先将字符串转换成float类型,然后将float类型转换成int类型,最后将int类型转换成long类型。
输出结果为:num2 = 1234
2.将小数四舍五入为整数
如果不想截断小数部分,可以使用round()函数将小数四舍五入为整数,然后再将整数转换成long类型。
#include
#include
using namespace std;
int main()
{
string str = "1234.56";
long num1 = round(stod(str));
cout << "num1 = " << num1 << endl;
return 0;
}
在上面的示例中,我们使用了stod()函数将字符串转换成double类型,然后使用round()函数将double类型的小数四舍五入为整数,最后把整数转换成long类型。
输出结果为:num1 = 1235
三、string转long数组
有时候我们需要将一个包含多个数字的字符串转换成long数组。可以使用stringstream来实现这一点。
#include
#include
#include
using namespace std;
int main()
{
string str = "123 456 789";
stringstream ss(str);
vector<long> nums;
long temp;
while (ss >> temp)
{
nums.push_back(temp);
}
for (int i = 0; i < nums.size(); i++)
{
cout << "nums[" << i << "] = " << nums[i] << endl;
}
return 0;
}
在上面的示例中,我们首先将字符串"123 456 789"放入stringstream中,然后使用while循环将每个数字转换成long类型,并存储到vector<long>类型的数组中。
输出结果为:
nums[0] = 123
nums[1] = 456
nums[2] = 789
四、string转long精度丢失
在转换double或float类型时,由于它们是浮点数,可能会导致精度丢失。同样,在将string类型转换成long类型时,也可能丢失精度。
例如:
#include
using namespace std;
int main()
{
string str = "9223372036854775807";
long num1 = stol(str);
cout << "num1 = " << num1 << endl;
string str2 = "9223372036854775808";
long num2 = stol(str2);
cout << "num2 = " << num2 << endl;
return 0;
}
在上面的示例中,我们尝试将字符串"9223372036854775807"和"9223372036854775808"分别转换成long类型。
输出结果为:
num1 = 9223372036854775807
num2 = -9223372036854775808
可以看出,long类型的最大值为9223372036854775807,当尝试将它加1时,会发生溢出。因此,当字符串超出long类型的范围时,会出现精度丢失的问题,需要采取一些特殊的处理方法。
五、string转long的方法
除了使用stol()函数,还有一些其他的方法可以将string类型转换成long类型:
1.使用atol()函数
#include
#include
using namespace std;
int main()
{
string str = "1234567812345678";
long num1 = atol(str.c_str());
cout << "num1 = " << num1 << endl;
return 0;
}
在上面的示例中,我们使用了atol()函数。这个函数只需要将string类型的参数转换成char*类型的C风格字符串,然后将它转换成long类型。
2.使用自定义函数
有时候我们可能需要写自己的函数来将一个字符串转换成long类型。例如,以下是一个可以处理负数的函数:
#include
#include
using namespace std;
long string2long(string str)
{
bool isNegative = str[0] == '-';
long num = 0;
int size = str.size();
for (int i = isNegative ? 1 : 0; i < size; i++)
{
num = num * 10 + str[i] - '0';
}
return isNegative ? -num : num;
}
int main()
{
string str = "-12345678";
long num1 = string2long(str);
cout << "num1 = " << num1 << endl;
return 0;
}
在上面的示例中,我们使用了自定义函数string2long()将带有负号的字符串转换成long类型。
六、string转long怎么转
将string类型转换成long类型的最简单的方法是使用stol()函数。
在有些情况下,需要进行一些额外的处理,例如:
1.当转换的字符串中包含非数字字符时,需要进行错误检查。
2.当转换的字符串超出了long类型的范围时,需要采取特殊的处理方法。
3.当转换的字符串中存在多个数字时,需要使用stringstream将多个数字转换成long数组。
在转换带小数的字符串时,需要选择将小数点之后的部分截断,或者将小数四舍五入为整数。
七、string转long报错
在使用stol()函数将string类型转换为long类型时,如果字符串中包含非数字字符,则会抛出一个std::invalid_argument异常。通常,我们需要编写异常处理代码来处理这种情况。
#include
#include
using namespace std;
int main()
{
string str = "123A456";
try
{
long num1 = stol(str);
cout << "num1 = " << num1 << endl;
}
catch (const invalid_argument& ia)
{
cerr << "Invalid argument: " << ia.what() << endl;
}
return 0;
}
在上面的示例中,我们尝试将字符串"123A456"转换成long类型。由于字符串中包含非数字字符'A',因此会抛出一个std::invalid_argument异常。
输出结果为: Invalid argument: stol
八、string转longlong
除了将string类型转换为long类型外,有时候还需要将其转换为longlong类型。可以使用stoll()函数来实现这一点。
#include
using namespace std;
int main()
{
string str = "1234567890123456789";
long long num1 = stoll(str);
cout << "num1 = " << num1 << endl;
return 0;
}
在上面的示例中,我们使用了stoll()函数将字符串"1234567890123456789"转换成了longlong类型。
输出结果为:num1 = 1234567890123456789
九、string转long超20位
有时候,字符串的长度可能超过long类型所能表示的范围(20位)。在这种情况下,我们可以使用Boost库或者GMP库来处理大数运算。
以下是使用Boost库来处理大数运算的示例:
#include <boost/multiprecision/cpp_int.hpp>
#include <iostream>
using boost::multiprecision::cpp_int;
int main()
{
cpp_int a = "123456789012345678901234567890";
cpp_int b = "987654321098765432109876543210";
cpp_int c = a + b;
std::cout << "c = " << c << std::endl;
return 0;
}
在上面的示例中,我们使用了Boost库的cpp_int类型,它可以处理超过long类型范围的整数。
输出结果为:c = 1111111110111111110011111111000
以下是使用GMP库来处理大数运算的示例:
#include <gmpxx.h>
#include <iostream>
using namespace std;
int main()
{
mpz_class a = "123456789012345678901234567890";
mpz_class b = "987654321098765432109876