C/C++ 實作 atoi 的方法

本篇 ShengYu 介紹 C/C++ 實作 atoi 字串轉數字的方法,標準函式庫已經有提供 atoi,如果是要自己實作 atoi 可以參考這篇的做法,有時候面試考題也會考實作 atoi,所以多學一些是好事,另外要注意的是 atoi 可能會與標準函式庫提供的同名重複定義,要確認輸入型別是否不一樣,否則的話就換個名字,避免衝突。

以下的 myatoi 字串轉數字實作方法為先判斷正負號,如果是負號開頭的話就在 sign 變數設定為 -1 記錄一下,最後的數字再乘上 sign 即可,主要邏輯為一個 while 迴圈去使用 isdigit 判斷每個字元是不是數字,該字元是數字的話就將字元減去 '0' 就可以得到數字,然後將該數字再加上之前的 sum * 10,最後整個 while 迴圈會遇到 '\0' 結束字元時 isdigit 會判斷成不是數字進而終止 while 迴圈,最後再將 sum 乘上 sign 變數就可以回傳最終結果。

這邊有對數字前有多餘的空格作處理,有多餘的空格的話可以使用 isspace 來跳過該空格,另外還有針對 32 bit 整數邊界進行處理,大於 2147483647 回傳 2147483647,小於 -2147483648 則回傳 -2147483648,另外輸入是超長的數字字串是 long 存不下的話,也會針對 len 長度太長進行邊界處理。

cpp-implement-atoi.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
// g++ cpp-implement-atoi.cpp -o a.out
#include <stdio.h>
#include <ctype.h>

int myatoi(const char *s) {
long sum = 0;
int i = 0;
int sign = 1;

while (isspace(s[i])) { i++; }

if (s[i] == '-') {
sign = -1;
i++;
} else if (s[i] == '+') {
i++;
}

int len = 0;
while (isdigit(s[i])) {
sum = sum * 10 + s[i] - '0';
i++;
len++;
if (len > 10)
break;
}

sum = sum * sign;
if (sum > 2147483647)
return 2147483647;
else if (sum < -2147483648)
return -2147483648;
else
return sum;
}

int main() {
printf("atoi: %d\n", myatoi("123"));
printf("atoi: %d\n", myatoi("0032"));
printf("atoi: %d\n", myatoi("4193 with words"));
printf("atoi: %d\n", myatoi(" -42"));
printf("atoi: %d\n", myatoi("-91283472332"));
printf("atoi: %d\n", myatoi("+1"));
printf("atoi: %d\n", myatoi("20000000000000000000"));
printf("atoi: %d\n", myatoi("00000-42a1234"));
return 0;
}

輸出如下,

1
2
3
4
5
6
7
8
atoi: 123
atoi: 32
atoi: 4193
atoi: -42
atoi: -2147483648
atoi: 1
atoi: 2147483647
atoi: 0

atoi 同時也是 LeetCode 的題目,可以看看 LeetCode 8. String to Integer (atoi),可以看看我之前的 解題

以上就是 C++ C/C++ 實作 atoi 的方法介紹,
如果你覺得我的文章寫得不錯、對你有幫助的話記得 Facebook 按讚支持一下!

其它相關文章推薦
C/C++ 新手入門教學懶人包
C/C++ 整數轉字串的方法與範例
C++ virtual 的兩種用法
C/C++ 字串反轉 reverse
C/C++ call by value傳值, call by pointer傳址, call by reference傳參考 的差別
C++ 類別樣板 class template
std::sort 用法與範例
std::find 用法與範例
std::queue 用法與範例
std::map 用法與範例