1. 前言:C語言中字串與數值轉換的重要性
在C語言的程式設計中,字串與數值之間的轉換是一項非常重要的操作。特別是在處理使用者輸入或外部檔案資料時,經常需要將字串轉換為數值。相反地,為了計算結果或記錄日誌,也常常需要將數值轉換為字串。
進行這些轉換時有多種方法可選,需根據實際使用情境審慎判斷。本篇將詳細說明C語言中如何進行字串與數值的轉換,並介紹錯誤處理與安全使用的方法。
2. C語言中將字串轉換為數值的方法
利用atoi()
函數進行基本字串→整數轉換
在C語言中,最基本的字串轉整數方法是使用atoi()
函數。這個函數非常容易上手,但也有一些注意事項。以下為基本範例:
#include <stdio.h>
#include <stdlib.h>
int main() {
char str[] = "123";
int num = atoi(str);
printf("轉換後的數值: %dn", num);
return 0;
}
atoi()
雖然簡單,但缺乏錯誤檢查。例如,遇到無效輸入時並不會報錯。下例說明atoi()
遇到無效字串時的行為:
char str[] = "123abc";
int num = atoi(str); // 只會轉換"123",其餘部分會被忽略
由於atoi()
對於含有無效內容的字串,只會返回成功轉換的部分,建議在需要高度安全性的系統中避免使用此函數。
使用strtol()
進行安全轉換
若需要錯誤檢查,建議使用strtol()
。strtol()
能處理無效輸入並進行錯誤處理,也能指定基數。以下為strtol()
安全轉換字串為整數的範例:
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
int main() {
char str[] = "123abc";
char *endptr;
errno = 0; // 重設錯誤狀態
long num = strtol(str, &endptr, 10);
if (errno != 0 || *endptr != ' ') {
printf("轉換失敗。n");
} else {
printf("轉換後的數值: %ldn", num);
}
return 0;
}
這個範例中,利用endptr
偵測無效字串部分,也透過errno
判斷是否有溢位等錯誤。

3. C語言中將數值轉換為字串的方法
利用sprintf()
及其風險
要將數值轉換為字串,可以使用sprintf()
。sprintf()
依照指定格式將數值轉為字串並寫入緩衝區。但需留意緩衝區溢位的風險。以下是基本用法:
#include <stdio.h>
int main() {
int num = 123;
char str[10];
sprintf(str, "%d", num);
printf("轉換後的字串: %sn", str);
return 0;
}
此範例雖將整數轉字串,但若轉換後長度超過緩衝區容量,會產生溢位危險。
用snprintf()
進行安全轉換
為避免溢位,推薦使用snprintf()
,可指定緩衝區大小,超出部分會被截斷。如下範例:
#include <stdio.h>
int main() {
int num = 12345;
char str[5];
snprintf(str, sizeof(str), "%d", num);
printf("轉換後的字串: %sn", str); // 緩衝區過小,結果為 "1234"
return 0;
}
本例中,輸出超過緩衝區大小時,多餘部分會被切斷。snprintf()
是防止溢位的安全選擇。
4. 實際範例:字串與數值的雙向轉換
C語言中經常需要雙向轉換字串與數值。下例展示利用sscanf()
和snprintf()
來完成字串轉數值、數值轉字串:
#include <stdio.h>
int main() {
char str[] = "12345";
int num;
sscanf(str, "%d", &num);
printf("字串轉數值: %dn", num);
char new_str[10];
snprintf(new_str, sizeof(new_str), "%d", num);
printf("數值轉字串: %sn", new_str);
return 0;
}
此範例先用sscanf()
將字串轉數值,再用snprintf()
把數值轉回字串。這類雙向轉換非常適合資料處理與結果輸出。
5. 錯誤處理與注意事項
處理溢位與下溢
將數值轉字串時,有可能發生溢位或下溢。特別是轉換後的數值超出資料型別範圍時會產生錯誤。建議使用strtol()
或sscanf()
時,參考下例進行錯誤處理:
if (errno == ERANGE) {
printf("發生溢位或下溢。n");
}
檢查errno
可判斷是否發生錯誤。正確處理錯誤能避免程式出現異常行為。
如何處理不合法輸入
如果字串格式不正確,數值轉換會失敗。例如像"123abc"
這種字串,只會轉換數字部分,其餘會被忽略。為防止此狀況,strtol()
可利用指標檢查轉換位置:
char *endptr;
long num = strtol(str, &endptr, 10);
if (*endptr != ' ') {
printf("輸入內容不合法。n");
}
6. 結論
進行數值與字串轉換時,務必做好錯誤檢查,採用安全的方法,以確保程式穩定運作。atoi()
雖然方便,但無法處理錯誤,建議多用strtol()
、sscanf()
、snprintf()
等安全性高的函數。
在C語言中學會字串與數值的轉換,是每位開發者的基礎技能。掌握此技能,可寫出更穩定、可靠的程式。正確處理錯誤與記憶體管理,也能提升程式的安全性。
進階學習建議
若想進一步學習,建議參考官方文件或開源專案的程式碼。也可閱讀C語言相關的錯誤處理、記憶體管理等專書,深入提升技能。