1. 前言
在 C 語言的程式設計中,經常會需要將字串轉換為數值。例如,將使用者輸入或從檔案讀取的資料當作整數處理。在這種情況下,非常方便的就是標準函式庫中所包含的 atoi
函式。然而,這個簡單又好用的 atoi
其實也有一些陷阱。本文將介紹 atoi
的用法、其限制,以及替代方案。希望大家能夠確實理解並安全地加以運用。
2. 什麼是 atoi 函式?
atoi
(ASCII to Integer)是 C 語言標準函式庫中的一個函式,主要功能是將字串轉換為整數。具體的用法如下:
#include <stdio.h>
#include <stdlib.h>
int main() {
int num = atoi("12345");
printf("%dn", num); // 輸出:12345
return 0;
}
在這個範例中,字串 “12345” 會被轉換成整數 12345
。用法非常簡單,也很容易讓初學者理解。
3. atoi 的運作機制
atoi
函式會從字串開頭開始依序讀取數字並轉換為整數,一旦遇到非數字字元時便會結束轉換。以下是範例:
printf("%dn", atoi("123abc")); // 輸出:123
printf("%dn", atoi("abc123")); // 輸出:0
atoi
只會處理最先出現的數字,後面的部分則會被忽略。因此,可以從混合內容的字串中擷取需要的數值。
4. atoi 函式的限制
atoi
最大的缺點是**沒有錯誤處理機制**。例如,轉換失敗時會回傳 0
,這使得無法區分是輸入不正確還是真的輸入了 0
。另外,atoi
只支援帶符號整數,對於非常大的數字或超出範圍的數字則有溢出的風險。
printf("%dn", atoi("abc")); // 輸出:0
printf("%dn", atoi("0")); // 輸出:0
因此,當需要正確判斷錯誤與有效結果時,不建議使用 atoi
。
5. 多執行緒環境下的注意事項
atoi
在多執行緒(multi-thread)環境下**並不是 thread-safe(執行緒安全)**。若多個執行緒同時使用 atoi
,可能會產生資料競爭並導致錯誤結果。在多執行緒環境下,建議改用 strtol
等 thread-safe 的函式。
6. 輸入驗證的重要性
在將使用者輸入直接傳給 atoi
之前,一定要先進行輸入驗證。例如,可以利用 isdigit
函式來確認字串是否僅由數字組成。
const char* str = "123abc";
int i = 0;
while (str[i] != ' ') {
if (!isdigit(str[i]) && str[i] != '-') {
printf("無效的輸入。n");
return 1;
}
i++;
}
透過這樣的驗證,可以避免處理到錯誤的輸入資料。

7. strtol 函式:atoi 的替代方案
若需要錯誤處理,建議使用 strtol
作為 atoi
的替代。strtol
會利用 endptr
來標示成功轉換的部分,因此能精確知道轉換失敗的位置。
char *end;
long num = strtol("123abc", &end, 10);
printf("%ldn", num); // 輸出:123
printf("%sn", end); // 輸出:abc
在這個例子中,123
被正確轉換,無法轉換的部分則保留在 end
。這是 atoi
無法做到的詳細錯誤處理。
8. 考慮錯誤處理的程式範例
接下來介紹如何用 strtol
進行錯誤處理。這可以讓程式在轉換失敗時有對應的應對方式。
#include <stdio.h>
#include <stdlib.h>
int main() {
char *end;
long num = strtol("123abc", &end, 10);
if (*end != ' ') {
printf("轉換失敗:%sn", end);
} else {
printf("轉換成功:%ldn", num);
}
return 0;
}
利用 strtol
,遇到錯誤時可以確認未被轉換的部分,讓程式更為健壯。
9. 最佳實踐建議
根據不同情況,請考慮選擇 atoi
或 strtol
:
- 只需要簡單的輸入處理,且不需錯誤判斷時:適合用
atoi
。 - 需要錯誤處理或需處理大數字時:建議使用
strtol
更為安全。
此外,針對使用者輸入或外部資料,一定要做好資料驗證。這樣可以大幅降低預期外的錯誤或安全漏洞。
10. 結論
atoi
是 C 語言中簡單的字串轉數值工具,但因為缺乏錯誤處理,不適合用於需要高可靠性的程式。當要處理錯誤或大數字時,請優先考慮 strtol
等替代方案。為了寫出安全且有效率的程式,務必根據實際需求選擇適當的函式。