如何實現字串轉換成整數(實現atoi內建函式)?

2022-01-10 07:22:07 字數 2489 閱讀 6849

輸入乙個由數字組成的字串,把它轉換成整數並輸出。例如:輸入字串"123",輸出整數123。

給定函式原型int strtoint(const char *str),實現字串轉換成整數的功能,不能使用庫函式atoi。

本題考查的實際上就是字串轉換成整數的問題,或者說是要你自行實現atoi函式。那如何實現把表示整數的字串正確地轉換成整數呢?以"123"作為例子:

因此,此題的基本思路便是:從左至右掃瞄字串,把之前得到的數字乘以10,再加上當前字元表示的數字。

思路有了,你可能不假思索,寫下如下**:

int strtoint(const char *str)

return n;

}

顯然,上述**忽略了以下細節:

空指標輸入:輸入的是指標,在訪問空指標時程式會崩潰,因此在使用指標之前需要先判斷指標是否為空。

正負符號:整數不僅包含數字,還有可能是以'+'或'-'開頭表示正負整數,因此如果第乙個字元是'-'號,則要把得到的整數轉換成負整數。

非法字元:輸入的字串中可能含有不是數字的字元。因此,每當碰到這些非法的字元,程式應停止轉換。

整型溢位:輸入的數字是以字串的形式輸入,因此輸入乙個很長的字串將可能導致溢位。

上述其它問題比較好處理,但溢位問題比較麻煩,所以咱們來重點看下溢位問題。

一般說來,當發生溢位時,取最大或最小的int值。即大於正整數能表示的範圍時返回max_int:2147483647;小於負整數能表示的範圍時返回min_int:-2147483648。

我們先設定一些變數:

而後,你可能會編寫如下**段處理溢位問題:

//當發生正溢位時,返回int_max

if ((sign == '+') && (c > max_int - n * 10))

//發生負溢位時,返回int_min

else if ((sign == '-') && (c - 1 > max_int - n * 10))

但當上述**轉換" 10522545459"會出錯,因為正常的話理應得到max_int:2147483647,但程式執行結果將會是:1932610867。

為什麼呢?因為當給定字串" 10522545459"時,而max_int是2147483647,即max_int(2147483647) < n*10(1052254545*10),所以當掃瞄到最後乙個字元『9』的時候,執行上面的這行**:

c > max_int - n * 10
已無意義,因為此時(max_int - n * 10)已經小於0,程式已經出錯。

針對這種由於輸入了乙個很大的數字轉換之後會超過能夠表示的最大的整數而導致的溢位情況,我們有兩種處理方式可以選擇:

對於上面第一種方式,雖然我們把n定義了長整型,但最後返回時系統會自動轉換成整型。咱們下面主要來看第二種處理方式。

對於上面第二種方式,先舉兩個例子說明下:

一直以來,我們努力的目的歸根結底是為了更好的處理溢位,但上述第二種處理方式考慮到直接計算n *10 + c 可能會大於max_int導致溢位,那麼便兩邊同時除以10,只比較n和max_int / 10的大小,從而巧妙的規避了計算n*10這一乘法步驟,轉換成計算除法max_int/10代替,不能不說此法頗妙。

如此我們可以寫出正確的處理溢位的**:

c = *str - '0';

if (sign > 0 && (n > max_int / 10 || (n == max_int / 10 && c > max_int % 10)))

else if (sign < 0 && (n > (unsigned)min_int / 10 || (n == (unsigned)min_int / 10 && c > (unsigned)min_int % 10)))

int strtoint(const char* str)

//處理空格

while (isspace(*str))

++str;

//處理正負

int sign = 1;

if (*str == '+' || *str == '-')

//確定是數字後才執行迴圈

while (isdigit(*str))

else if (sign < 0 && (n >(unsigned)min_int / 10 || (n == (unsigned)min_int / 10 && c > (unsigned)min_int % 10)))

//把之前得到的數字乘以10,再加上當前字元表示的數字。

n = n * 10 + c;

++str;

}return sign > 0 ? n : -n;

}

實現string到double的轉換

分析:此題雖然類似於atoi函式,但畢竟double為64位,而且支援小數,因而邊界條件更加嚴格,寫**時需要更加注意。

2 實現將字串轉換成整數

將字串轉換成整數,在c標準庫中有函式atoi可以實現需求,面試筆試時常常要求不能呼叫系統庫函式實現。atoi函式原型為 int atoi const char nptr 函式功能為 引數nptr字串,如果 第乙個非空格字元 存在,是數字或者正負號則開始做型別轉換,之後檢測到非數字 包括結束符 0 字...

把字串轉換成整數 C 實現

解題注意點 1 判斷標記非法輸入,出0到9外其他輸入 但是 和 屬於合法輸入 2 判斷空指標 空字串 3 考慮溢位 int 範圍為0x7fffffff 0x80000000 直接上 吧 include using namespace std enum status int g status kinv...

字串轉換成整數

題目詳情 輸入乙個表示整數的字串,把該字串轉換成整數並輸出,例如輸入字串 345 則輸出整數345。請完成函式strtoint,實現字串轉換成整數的功能。友情提醒 提交 之前,請複查下你的程式,比如當給的字串是如左邊所示的時候,有考慮到麼?當然,它們各自對應的正確輸出如右邊所示 假定你是在32位系統...