語法書 / AA 競程語法書 下冊 / 第十六單元 / stoi 與 stoll 的進制參數

16.5 stoi 與 stoll 的進制參數

手寫轉換是本單元的重點功夫,但也該知道:「進制字串轉整數」這個方向,標準函式庫有現成的10.9 學過的 stoistoll,其實一直都有三個參數:

stoi(s, nullptr, K)     // 把字串 s 當成 K 進制解讀,回傳 int
stoll(s, nullptr, K)    // 同上,回傳 long long

第三個參數就是進制 K2 \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

第三行是個貼心設計:字母大小寫都接受1a1A 一樣是 26——用它就不必煩惱 16.3 說的大小寫統一問題。

那反方向呢?「整數轉 K 進制字串」沒有像 stoll 這麼順手的現成函式——to_string 只會出十進制;cout 雖有印十六、八進制的特殊模式,也只管得了這兩種;C++17 的 to_chars 支援任意進制,卻冷門又得自己管字元陣列。所以 16.4 的手寫版仍是競程的標準做法,這也是為什麼即使有 stoll,16.4 的功夫一點都不白練。

動手試試看:把你解進制轉換那題的程式前半段換成一行 stoll,重新提交一次,確認一樣 AC——體會一下「會手寫」和「會用現成的」都在手上的踏實感。