首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> 關於C

C語言字符串轉數值全攻略:strtol 族函數支援 2-36 進制

     編輯:關於C

為什麼不推薦 `atoi`/`atol`?

  • 無法檢測錯誤(非數字字符、溢出)
  • 僅支援十進制
  • 行為未定義(溢出時)

核心函數:strtol / strtoul / strtoll


#include 
long strtol(const char *nptr, char **endptr, int base);
unsigned long strtoul(const char *nptr, char **endptr, int base);
long long strtoll(const char *nptr, char **endptr, int base);

參數詳解

  • nptr:待轉換字符串,跳過前導空白,遇非數字停止。
  • endptr:輸出參數,若非 NULL,指向第一個未被轉換的字符。利用此特性可精準判斷「完全無效」或「部分有效」。
  • base:2~36 或 0。
    • 0 = 自動檢測:`0x`/`0X`→16進制,`0`→8進制,否則 10 進制。
    • 16 進制允許可選前綴 `0x`/`0X`,大小寫不敏感。

返回值與錯誤處理

  • 正常:返回轉換後的值。
  • 溢出:返回 `LONG_MAX`/`LONG_MIN`(或 `ULLONG_MAX`),並設置 `errno = ERANGE`。
  • 無有效數字:返回 0,`endptr` 指向 `nptr` 開頭。

實戰示例


#include 
#include 
#include 

int main() {
    char *p;
    // 1. 十進制
    long x = strtol("100", &p, 10);
    printf("x=%ld, next='%s'\n", x, p);  // x=100, next=''

    // 2. 二進制
    long y = strtol("100", &p, 2);
    printf("y=%ld, next='%s'\n", y, p);  // y=4, next=''

    // 3. 十六進制(帶前綴)
    long z = strtol("0x11", &p, 16);
    printf("z=%ld, next='%s'\n", z, p);  // z=17, next=''

    // 4. 自動檢測 base=0
    long a = strtol("077", &p, 0);   // 八進制 63
    long b = strtol("0xFF", &p, 0);  // 十六進制 255
    long c = strtol("123", &p, 0);   // 十進制 123

    // 5. 錯誤檢測:非數字開頭
    errno = 0;
    long err = strtol("abc", &p, 10);
    if (err == 0 && p == "abc") puts("完全無效輸入");

    // 6. 溢出檢測
    errno = 0;
    long big = strtol("9999999999999999999", &p, 10);
    if (errno == ERANGE) puts("溢出!");
}

進制轉換速查表

需求函數base示例輸入結果
字符串→十進制整數strtol10"-123"-123
字符串→二進制整數strtol2"1010"10
字符串→八進制整數strtol8"077"63
字符串→十六進制整數strtol16"0xFF" / "FF"255
自動識別進制strtol0"0xFF" / "077" / "123"255 / 63 / 123
無符號大整數strtoul0/16/10"4294967295"UINT_MAX

總結

拋棄 `atoi`,擁抱 `strtol` 族:支援任意進制、完整錯誤報告、可移植、標準 C(C89 起)。配合 `endptr` 做輸入驗證,是解析配置文件、命令行參數、網絡協議的首選。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved