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

C語言 strtol 函數詳解:字符串轉長整型的健壯選擇

     編輯:關於C語言

函數原型

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

參數詳解

轉換規則

  1. 跳過前導空白字符(isspace)
  2. 可選符號 + / -
  3. 若 base=0 或 base=16,可選 0x/0X 前綴
  4. 盡可能多地匹配合法數字字符(0-9, a-z/A-Z 對應值 < base)
  5. 遇非法字符或字符串結束停止

返回值與錯誤處理

  • 成功:返回轉換後的 long 值
  • 溢出:返回 LONG_MAX 或 LONG_MIN,並設置 errno = ERANGE
  • 無合法數字:返回 0,endptr 指向 nptr

對比:strtol vs atoi vs sscanf

參數說明
nptr待轉換字符串指針
endptr輸出參數,若非 NULL,存儲轉換結束位置的下一字符指針(用於錯誤檢查/繼續解析)
base進制基數:2~36 或 0。0 表示自動檢測:0x 前綴→16進制,0 前綴→8進制,否則 10 進制
特性strtolatoisscanf
錯誤檢測完善(endptr + errno)無(返回 0 無法區分錯誤)一般(返回匹配項數)
進制支持2-36 + 自動檢測僅 10 進制格式字符串控制
溢出處理飽和 + errno未定義行為未定義行為
性能高高較低(解析格式串)
線程安全是是是

最佳實踐代碼模板

long safe_strtol(const char *s, int base, bool *ok) {
    char *end;
    errno = 0;
    long val = strtol(s, &end, base);

    if (end == s) {           // 無任何數字被消耗
        *ok = false; return 0;
    }
    if (errno == ERANGE) {    // 溢出
        *ok = false; return val;  // val 為 LONG_MAX/MIN
    }
    if (*end != '\0') {       // 尾部有殘留非數字字符(可選嚴格模式)
        *ok = false; return val;
    }
    *ok = true; return val;
}

進階用法:解析多數字字符串

void parse_numbers(const char *s) {
    char *end = (char *)s;
    while (*end) {
        errno = 0;
        long val = strtol(end, &end, 10);
        if (end == (char *)s) break;  // 無進展,防死循環
        if (errno == ERANGE) { /* 處理溢出 */ }
        printf("解析到: %ld\n", val);
        // end 已指向下一個待解析字符,循環繼續
    }
}

相關函數族

  • strtoul / strtoull:無符號長整型 / 64 位
  • strtod / strtof / strtold:浮點數
  • strtoimax / strtoumax:C99 最大寬度整數
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved