16.5 stoi 與 stoll 的進制參數
手寫轉換是本單元的重點功夫,但也該知道:「進制字串轉整數」這個方向,標準函式庫有現成的。10.9 學過的 stoi/stoll,其實一直都有三個參數:
stoi(s, nullptr, K) // 把字串 s 當成 K 進制解讀,回傳 int
stoll(s, nullptr, K) // 同上,回傳 long long
第三個參數就是進制 K,2 \sim 36 都行;不填就是 10——所以 10.9 教的用法只是它的預設模式。中間那個 nullptr 跟「回報轉換停在字串哪裡」的進階用法有關,競程用不到,照抄就對了。
¶範例程式碼
#include <iostream>
#include <string>
using namespace std;
int main() {
cout << stoll("11010", nullptr, 2) << '\n'; // 二進制字串 -> 整數
cout << stoll("1A", nullptr, 16) << '\n'; // 十六進制
cout << stoll("1a", nullptr, 16) << '\n'; // 小寫字母也接受
cout << stoll("ZZ", nullptr, 36) << '\n'; // 36 進制:35 × 36 + 35
cout << stoll("3072", nullptr, 10) << '\n'; // 進制填 10,就是 10.9 的老朋友
return 0;
}
執行結果:
26
26
26
1295
3072
第三行是個貼心設計:字母大小寫都接受,1a 和 1A 一樣是 26——用它就不必煩惱 16.3 說的大小寫統一問題。
那反方向呢?「整數轉 K 進制字串」沒有像 stoll 這麼順手的現成函式——to_string 只會出十進制;cout 雖有印十六、八進制的特殊模式,也只管得了這兩種;C++17 的 to_chars 支援任意進制,卻冷門又得自己管字元陣列。所以 16.4 的手寫版仍是競程的標準做法,這也是為什麼即使有 stoll,16.4 的功夫一點都不白練。
動手試試看:把你解進制轉換那題的程式前半段換成一行 stoll,重新提交一次,確認一樣 AC——體會一下「會手寫」和「會用現成的」都在手上的踏實感。