實際開發中常需從字符串中解析數字,如配置文件解析、協議字段提取、用戶輸入處理。標準庫 strtol/sscanf 功能強大但較重,針對純數字字符串轉十進制、十六進制字符串轉十進制的輕量級場景,手寫解析函數更高效、可控。本文提供兩個精簡函數 Read_DecNumber、Read_HexNumber,附完整代碼與測試。
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。// 解析字符串開頭的十六進制數字(支持 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;
}
特點:
0x 前綴要求,純裸十六進制數字串。"FFG" → 255。#includetypedef 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 | 格式化強大 | 極慢、棧消耗大、返回值易誤解 | 複雜格式掃描、原型開發 |
value > (MAX - digit) / base。'+'/'-',記錄符號位。while (isspace(*str)) str++;。str - start 供調用者繼續解析。手寫 Read_DecNumber/Read_HexNumber 體現了 C 語言指針遍歷、位值累積的極簡美學:
value = value * 10 + (ch - '0')value = value * 16 + digit_value(ch)無庫依賴、無錯誤碼擾民、行為完全可預測,是嵌入式、高性能解析、教學演示的理想選擇。理解其核心邏輯,亦能輕鬆擴展至八進制、任意基數、帶符號等變體。