string转long的全方位详解

要将一个字符串转换成long类型是一个常见的需求。在编程中,这种转换有时会碰到各种问题。本文将从多个方面来详细介绍string转long的方法和相关问题,包括:

一、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

原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/275932.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝小蓝
上一篇 2024-12-17 19:37
下一篇 2024-12-17 19:38

相关推荐

  • c# enum转换成string

    本文将从以下几个方面详细阐述c#中enum类型转换成string类型的方法及注意事项。 一、基本语法和示例 c#中的enum类型可以看作是一组有名字的常量值,通常用于定义一组相关的…

    编程 2025-04-29
  • MySQL bigint与long的区别

    本文将从数据类型定义、存储空间、数据范围、计算效率、应用场景五个方面详细阐述MySQL bigint与long的区别。 一、数据类型定义 bigint在MySQL中是一种有符号的整…

    编程 2025-04-28
  • JWT String Argument Cannot Be Null or Empty

    JWT(JSON Web Token)是一种用于进行身份验证的标准。在使用JWT时,经常会遇到“JWT String Argument Cannot Be Null or Empt…

    编程 2025-04-27
  • Python中String包含的进阶应用

    对于Python程序员而言,String类型的操作是日常工作中必不可少的一部分。String包含的操作很多,其中最基础的操作就是判断一个字符串是否包含另一个字符串。本篇文章将对Py…

    编程 2025-04-27
  • Linux sync详解

    一、sync概述 sync是Linux中一个非常重要的命令,它可以将文件系统缓存中的内容,强制写入磁盘中。在执行sync之前,所有的文件系统更新将不会立即写入磁盘,而是先缓存在内存…

    编程 2025-04-25
  • 神经网络代码详解

    神经网络作为一种人工智能技术,被广泛应用于语音识别、图像识别、自然语言处理等领域。而神经网络的模型编写,离不开代码。本文将从多个方面详细阐述神经网络模型编写的代码技术。 一、神经网…

    编程 2025-04-25
  • nginx与apache应用开发详解

    一、概述 nginx和apache都是常见的web服务器。nginx是一个高性能的反向代理web服务器,将负载均衡和缓存集成在了一起,可以动静分离。apache是一个可扩展的web…

    编程 2025-04-25
  • Linux修改文件名命令详解

    在Linux系统中,修改文件名是一个很常见的操作。Linux提供了多种方式来修改文件名,这篇文章将介绍Linux修改文件名的详细操作。 一、mv命令 mv命令是Linux下的常用命…

    编程 2025-04-25
  • Python输入输出详解

    一、文件读写 Python中文件的读写操作是必不可少的基本技能之一。读写文件分别使用open()函数中的’r’和’w’参数,读取文件…

    编程 2025-04-25
  • git config user.name的详解

    一、为什么要使用git config user.name? git是一个非常流行的分布式版本控制系统,很多程序员都会用到它。在使用git commit提交代码时,需要记录commi…

    编程 2025-04-25

发表回复

登录后才能评论