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

C語言字符串轉十進制:提取十進制與十六進制數字

     編輯:關於C

實際開發中常需從字符串中解析數字,如配置文件解析、協議字段提取、用戶輸入處理。標準庫 strtol/sscanf 功能強大但較重,針對純數字字符串轉十進制、十六進制字符串轉十進制的輕量級場景,手寫解析函數更高效、可控。本文提供兩個精簡函數 Read_DecNumber、Read_HexNumber,附完整代碼與測試。

核心函數實現

1. 字符串中的十進制數字 → 整數

typedef char TUINT8;
typedef int TUINT32;

// 解析字符串開頭的十進制數字,遇到非數字停止
TUINT32 Read_DecNumber(const TUINT8 *str) {
    TUINT32 value = 0;
    if (!str) return 0;

    while (*str >= '0' && *str <= '9') {
        value = value * 10 + (*str - '0');  // 累積:原值×10 + 新位
        str++;
    }
    return value;
}

特點:

  • 僅處理開頭連續數字,如 "123abc" → 123。
  • 無符號累積,自動忽略前導零。
  • 指針遍歷,無需索引變量。

2. 字符串中的十六進制數字 → 整數

// 解析字符串開頭的十六進制數字(支持 0-9, A-F, a-f),遇非法字符停止
TUINT32 Read_HexNumber(const TUINT8 *str) {
    TUINT32 value = 0;
    if (!str) return 0;

    while (1) {
        if (*str >= '0' && *str <= '9') {
            value = value * 16 + (*str - '0');
        } else if (*str >= 'A' && *str <= 'F') {
            value = value * 16 + (*str - 'A') + 10;
        } else if (*str >= 'a' && *str <= 'f') {
            value = value * 16 + (*str - 'a') + 10;
        } else {
            break;  // 非十六進制字符,結束解析
        }
        str++;
    }
    return value;
}

特點:

  • 大小寫兼容(A-F / a-f)。
  • 無 0x 前綴要求,純裸十六進制數字串。
  • 遇首個非法字符即停止,如 "FFG" → 255。

完整測試程序

#include 

typedef char TUINT8;
typedef int TUINT32;

TUINT32 Read_DecNumber(const TUINT8 *str);
TUINT32 Read_HexNumber(const TUINT8 *str);

int main() {
    int dec = Read_DecNumber("1000");
    int hex = Read_HexNumber("A");

    printf("字符串十進制轉整數: %d\n", dec);  // 1000
    printf("字符串十六進制轉整數: %d\n", hex); // 10

    // 更多測試
    printf("\"123abc\" -> %d\n", Read_DecNumber("123abc"));  // 123
    printf("\"FF\" -> %d\n", Read_HexNumber("FF"));          // 255
    printf("\"1a2b\" -> %d\n", Read_HexNumber("1a2b"));      // 6699
    printf("\"GHI\" -> %d\n", Read_HexNumber("GHI"));        // 0

    return 0;
}

運行結果

字符串十進制轉整數: 1000
字符串十六進制轉整數: 10
"123abc" -> 123
"FF" -> 255
"1a2b" -> 6699
"GHI" -> 0

對比標準庫函數

函數優點缺點適用場景
Read_DecNumber極輕量、無依賴、行為確定、可嵌入 ISR無錯誤碼、不處理符號/溢出/空格嵌入式、協議解析、已知格式輸入
Read_HexNumber同上,支持大小寫十六進制同上,不支持 0x 前綴十六進制數據包解析、寄存器值設置
strtol標準、完整錯誤處理、支持基數 2-36、前綴識別較重、需 errno、非線程安全(舊版)通用用戶輸入、配置文件、未知格式
sscanf格式化強大極慢、棧消耗大、返回值易誤解複雜格式掃描、原型開發

擴展建議

  1. 添加溢出檢測:累積前判斷 value > (MAX - digit) / base。
  2. 支持符號:開頭檢查 '+'/'-',記錄符號位。
  3. 跳過空白字符:解析前 while (isspace(*str)) str++;。
  4. 返回解析長度:雙指針記錄起始位置,返回 str - start 供調用者繼續解析。

總結

手寫 Read_DecNumber/Read_HexNumber 體現了 C 語言指針遍歷、位值累積的極簡美學:

  • 十進制:value = value * 10 + (ch - '0')
  • 十六進制:value = value * 16 + digit_value(ch)

無庫依賴、無錯誤碼擾民、行為完全可預測,是嵌入式、高性能解析、教學演示的理想選擇。理解其核心邏輯,亦能輕鬆擴展至八進制、任意基數、帶符號等變體。

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