stoi 是 C++ 標準庫中的一個函式,定義在標頭檔案 <string>
中,它用於將字串轉換為整數型別。
函式原型
int stoi(const std::string& str, size_t* idx = 0, int base = 10);
-
str(必選):要轉換的字串,必須以數字開頭(可以包含正負號)。
插一句題外話
如果不以數字開頭,會這樣:
-
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;
}
輸出如下:
注意事項
-
stoi 只能處理整數。如果需要轉換浮點數,使用
std::stof
或std::stod
。 -
stoi 是基於 std::strtol 實現的,但比 std::strtol 更易用。