10.9 string 與數字的互相轉換
「數字」和「字串」是兩個世界:123 能加減乘除,"123" 能取位數、取子字串。標準函式庫提供了雙向的傳送門:
| 方向 | 函式 | 說明 |
|---|---|---|
| 字串 → 數 | stoi(s) |
string to int:stoi("123") 得 123 |
| 字串 → 數 | stoll(s)/stod(s) |
同上,回傳 long long/double |
| 數 → 字串 | to_string(x) |
整數、浮點數都能轉 |
#include <iostream>
#include <string>
using namespace std;
int main() {
string s = "123";
int x = stoi(s); // 字串 → int
cout << x + 1 << '\n'; // 這下是真的數字了
long long big = stoll("9876543210"); // 超過 int 範圍的數:用 stoll
cout << big << '\n';
string t = to_string(20260721); // 數 → 字串
cout << t.size() << '\n'; // 一秒數出位數
return 0;
}
執行結果:
124
9876543210
8
¶把數字當字串處理
這一節真正的殺手級應用是一種思維:不少題目輸入明明是數字,卻當字串處理更好寫——尤其是跟「位數」有關的題目(各位數字和、判斷迴文數、取出某幾位……)。數字世界要靠除以 10、取餘數層層拆解的事,字串世界一個索引就搞定:
#include <iostream>
#include <string>
using namespace std;
int main() {
string s;
cin >> s; // 把「數字」當字串讀進來
int sum = 0;
for (int i = 0; i < (int)s.size(); i++) {
sum += s[i] - '0'; // 8.2 的老朋友:單一字元用減法
}
cout << sum << '\n'; // 各位數字的和
return 0;
}
執行結果(輸入 20260721):
20
搭配 8.2 做個總整理:單一字元變數值,用減法 s[i] - '0';一整串變數值,用 stoi(s)。兩個工具各有戰場,混搭最強——逐位檢查用前者,需要整體數值時用後者,to_string 再把數字送回字串世界。(用 .size() 數位數只對非負整數成立:to_string(-12) 是 "-12"、長度 3;浮點數轉出來還帶小數點和補零的小數位,別用這招數位數。)
動手試試看:解掉一半一半(把數字的十進位表示切成前後兩半比較——字串世界的主場)和訂閱人數(依位數捨去的近似值,to_string 加 substr 的綜合應用),實際體會「在字串世界處理數字」比硬算快多少。