在 C 語言開發中,將整數轉換為字串是常見需求。標準庫雖提供 sprintf 等函式,但理解底層實作有助於掌握進制轉換、記憶體管理與指標操作等核心概念。本文將深入解析一個支援 2~36 進制的通用整數轉字串函式 digitToAlpha。
char *digitToAlpha(int val, char *buf, unsigned radix);
參數說明:
val:待轉換的整數(可為負數)buf:呼叫端提供的字元緩衝區,用於存放結果字串radix:目標進制(2~36),10 進制直接轉換,其他進制先轉為對應進制數值再生成字串回傳值:指向 buf 的指標,方便鏈式呼叫。
若 val < 0,先在緩衝區寫入 '-',再將 val 轉為無號長整數的正值處理,避免 INT_MIN 取反溢位。
採用「除基取餘」法,從最低位開始提取數字:
digval = val % radixdigval < 10 → '0' + digval;digval >= 10 → 'a' + (digval - 10)因提取順序為反序,需將有效字元區段原地反轉,最後補上 '\0' 結尾。
#include <stdio.h>
#include <stdlib.h>
char *digitToAlpha(int val, char *buf, unsigned radix) {
char *p = buf;
char *firstdig = p;
char temp;
unsigned digval;
/* 負數處理 */
if (val < 0) {
*p++ = '-';
val = (unsigned long)(-(long)val);
}
firstdig = p; /* 記錄第一個數字位置 */
/* 逐位提取(低位在前) */
do {
digval = (unsigned)(val % radix);
val /= radix;
if (digval > 9)
*p++ = (char)(digval - 10 + 'a');
else
*p++ = (char)(digval + '0');
} while (val > 0);
/* 反轉字串 */
*p-- = '\0';
do {
temp = *p;
*p = *firstdig;
*firstdig = temp;
--p;
++firstdig;
} while (firstdig < p);
return buf;
}
int main(void) {
int iNum = 55;
char strNum[10] = "";
digitToAlpha(iNum, strNum, 10);
printf("%s\n", strNum); /* 輸出: 55 */
return 0;
}
| 技術點 | 說明 |
|---|---|
| 無號轉換 | 用 (unsigned long)(-(long)val) 避免 INT_MIN 絕對值溢位 |
| 進制支援 | 2~36 進制統一處理,10 進制為特例 |
| 原地反轉 | 雙指標交換,空間複雜度 O(1) |
| 緩衝區安全 | 呼叫端負責分配足夠空間(建議 ≥ 34 字元含結尾) |
if (radix < 2 || radix > 36) return NULL;snprintf(buf, n, "%d", val) 更標準、安全digitToAlpha 展示了 C 語言處理進制轉換、指標運算與字串操作的經典技巧。雖然現代開發多直接使用標準庫,但理解其內部機制對嵌入式開發、底層庫實作與面試題目皆有實際幫助。