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/zh-tw/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

發表回復

登錄後才能評論