stoi函式介紹

hisun9發表於2024-11-16

stoi 是 C++ 標準庫中的一個函式,定義在標頭檔案 <string> 中,它用於將字串轉換為整數型別。

函式原型

int stoi(const std::string& str, size_t* idx = 0, int base = 10);
  • str(必選):要轉換的字串,必須以數字開頭(可以包含正負號)。

    插一句題外話

    如果不以數字開頭,會這樣:

    img

  • idx(可選):用來儲存解析結束的位置(字串中第一個非數字字元的索引)。如果不需要這個資訊,可以傳入 nullptr 或省略。

  • base(可選):數字的進位制,預設值為 10(十進位制)。支援 2-36 的進位制轉換(注意是將base指定的進位制轉換為十進位制,後面的常見用法裡面會舉一個相關的例子)。

功能描述

  • 將字串轉換為整數。如果字串中有非法字元,stoi 會丟擲異常。

  • 字串可以包含前導空格和符號(+ 或 -)。

  • 轉換以第一個非數字字元或字串末尾結束。

常見用法

1. 基本轉換

將字串轉換為整數:

#include <iostream>
#include <string>

int main() {
    std::string s = "123";
    int num = std::stoi(s);
    std::cout << "整數值: " << num << std::endl; // 輸出: 123
    return 0;
}

2. 轉換含符號的數字

可以處理正負號:

#include <iostream>
#include <string>

int main() {
    std::string s1 = "-456";
    std::string s2 = "+789";
    int num1 = std::stoi(s1);
    int num2 = std::stoi(s2);
    std::cout << num1 << ", " << num2 << std::endl; // 輸出: -456, 789
    return 0;
}

3. 提取部分字串

使用 idx 提取未轉換的部分:

#include <iostream>
#include <string>

int main() {
    std::string s = "123abc";
    size_t idx;
    int num = std::stoi(s, &idx);
    std::cout << "整數值: " << num << std::endl;       // 輸出: 123
    std::cout << "未轉換部分: " << s.substr(idx) << std::endl; // 輸出: abc
    return 0;
}

4. 轉換不同進位制的數字

支援其他進位制(例如二進位制、十六進位制等):

#include <iostream>
#include <string>

int main() {
    std::string binary = "1010";  // 二進位制字串
    std::string hex = "1F";       // 十六進位制字串

    int num1 = std::stoi(binary, nullptr, 2); // 二進位制轉換
    int num2 = std::stoi(hex, nullptr, 16);   // 十六進位制轉換

    std::cout << "二進位制轉整數: " << num1 << std::endl; // 輸出: 10
    std::cout << "十六進位制轉整數: " << num2 << std::endl; // 輸出: 31
    return 0;
}

異常處理

stoi 會丟擲以下異常:

  • std::invalid_argument:當字串不包含任何數字時(如 "abc")。

  • std::out_of_range:當結果超出 int 型別的範圍。

舉個例子

#include <iostream>
#include <string>

int main() {
    try {
        std::string invalid = "abc";
        int num = std::stoi(invalid); // 丟擲 std::invalid_argument
    } catch (const std::invalid_argument& e) {
        std::cout << "無效輸入: " << e.what() << std::endl;
    }

    try {
        std::string too_large = "9999999999999999999";
        int num = std::stoi(too_large); // 丟擲 std::out_of_range
    } catch (const std::out_of_range& e) {
        std::cout << "超出範圍: " << e.what() << std::endl;
    }

    return 0;
}

輸出如下:

img

注意事項

  • stoi 只能處理整數。如果需要轉換浮點數,使用 std::stofstd::stod

  • stoi 是基於 std::strtol 實現的,但比 std::strtol 更易用。

相關文章