字串轉整數

2021-08-10 12:31:46 字數 3232 閱讀 9092

題目描述

輸入乙個由數字組成的字串,把它轉換成整數並輸出。例如:輸入字串」123」,輸出整數123。給定函式原型int strtoint(const char *str) ,實現字串轉換成整數的功能,不能使用庫函式atoi。

分析與解答:

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

當我們掃瞄到字串的第乙個字元』1』時,由於我們知道這是第一位,所以得到數字1。當掃瞄到第二個數字』2』時,而之前我們知道前面有乙個1,所以便在後面加上乙個數字2,那前面的1相當於10,因此得到數字:1*10+2=12。繼續掃瞄到字元』3』,』3』的前面已經有了12,由於前面的12相當於120,加上後面掃瞄到的3,最終得到的數是:12*10+3=123。因此,此題的基本思路便是:從左至右掃瞄字串,把之前得到的數字乘以10,再加上當前字元表示的數字。

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

int strtoint(const char *str)

return n;

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

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

為空。

2. 正負符號:整數不僅包含數字,還有可能是以』+』或』-『開頭表示正負整數,因此如果第乙個字元是』-

『號,則要把得到的整數轉換成負整數。

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

轉換。

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

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

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

2147483647;小於負整數能表示的範圍時返回min_int:-2147483648。

我們先設定一些變數:

sign用來處理數字的正負,當為正時sign > 0,當為負時sign < 0

n存放最終轉換後的結果

c表示當前數字

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

//當發生正溢位時,返回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定義成long long,即long long n;另外一種則是只比較n和max_int / 10的大小,即:

若n > max_int / 10,那麼說明最後一步轉換時,n*10必定大於max_int,所以在得知n >

max_int / 10時,當即返回max_int。

若n == max_int / 10時,那麼比較最後乙個數字c跟max_int % 10的大小,即如果n ==

max_int / 10且c > max_int % 10,則照樣返回max_int。

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

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

如果我們要轉換的字串是」2147483697」,那麼當我掃瞄到字元』9』時,判斷出214748369 >

max_int / 10 = 2147483647 / 10 = 214748364(c語言裡,整數相除自動取整,不留小數),則返回max_int;

如果我們要轉換的字串是」2147483648」,那麼判斷最後乙個字元』8』所代表的數字8與max_int %10 = 7的大小,前者大,依然返回max_int。

一直以來,我們努力的目的歸根結底是為了更好的處理溢位,但上述第二種處理方式考慮到直接計算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 > (un

signed)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;

}

整數轉字串

將輸入的整數轉化為字串。輸入 整數 輸出 指向字串的指標 函式原型 char shuzi2zifu int n include include includechar shuzi2zifu int n else flag 0 int m n while n printf d n count p ch...

字串轉整數

題目 題目也沒給樣例,做起來覺得怪怪的,注意以下幾點之後就ac啦 需要去掉首尾空字元 需要判斷符號 碰到非數字字元就捨棄 include include using namespace std atoi 表示 ascii to integer 把字串轉換成整型數的乙個函式 1 需要去掉首尾空字元 2...

字串轉整數

字串轉整數 user hihone date 2019 2 2 time 10 58 description 首先,該函式會根據需要丟棄無用的開頭空格字元,直到尋找到第乙個非空格的字元為止。當我們尋找到的第乙個非空字元為正或者負號時,則將該符號與之後面盡可能多的連續數字組合起來,作為該整數的正負號 ...