高階版字串轉化為整數(atoi

2021-10-07 19:50:21 字數 3454 閱讀 1012

這道題是在劍指 offer 67. 把字串轉換成整數的基礎上衍生出來的,它需要處理更多的複雜情況,我們來看一下吧!

程式設計實現將字串轉換為整型數; int my_atoi(const char *str);

遇到非數字字母,停止轉換;

示例: str = 「234.324」 ; 返回值是234;

首先出現空格的字串可以轉換,轉換開始後,遇到空格停止轉換;

示例: str =" 342 456"; 返回值是342;

可以處理正負號;

示例: str = " +234.bad" ; 返回值是 234; str =" -342ab.234" ; 返回值是:-342;

可以處理八進位制,和十六進製制;

示例: str = " +0xa1"; 返回值是 161; str = " 0123" ; 返回值是 83;

可以進行糾錯,如果不小心輸入將0寫成小寫字元『o』,大寫字元『o』;將1寫成小寫』l』,大寫『l』;我們應該進行自動糾錯。

示例: str = 「l23」 ; 返回值是 123; str =「1o2」 ; 返回值是:102;

可以處理int 型溢位的情況;

示例; str = 「567898765678987656789」; str = 2147483647; (int_max 巨集在 limits.h 標頭檔案中)

str = "-234324665544325345325; str = - 2147483648; (int_min 巨集在limits.h 標頭檔案中)

【解題思路:】

我們在劍指 offer 67. 把字串轉換成整數這篇中對大部分情況的處理已經做了詳細的介紹,這篇我們就只詳細講解如何處理

八、十六進製制,糾錯問題。因為處理的情況過多,所以我們需要將函式進行封裝,這樣讓**更加的模組化。我們不對十六進製制,八進位制進行溢位判斷,因為方法都是一樣的,有興趣的可以自己加上進行判斷。我們將封裝為下面幾個模組:

主函式模組:進行空格處理,非字元處理,正負號處理,根據條件呼叫其他函式。

糾錯函式模組:利用switch對字元進行糾錯。

處理十進位制函式:呼叫糾錯函式,進行字元轉為十進位制,判斷溢位。

處理八進位制:如果第一位數字為0,則表示為八進位制,呼叫糾錯函式,進行字元轉為八進位制。

處理十六進製制:如果第一位為0,第二位為x,表示為十六進製制,呼叫糾錯函式,進行字元轉為十六進製制。

【2.糾錯函式模組】:每次糾正乙個字元,所以需要多次呼叫進行糾錯。利用switch(x)函式進行糾錯,最後返回糾錯後的字元,格式為:

switch(x)

採用這樣的格式可以進行多個字元的糾錯。

【3.處理十進位制函式模組】:

【4.處理八進位制函式模組】:

八進位制的處理和十進位制區別不大,改變判斷,連線條件即可。

【5.處理十六進製制函式模組】:

十六進製制會存在字元的轉換,如a->10,那麼我們就不能用函式isdigit來判斷了,需要用isxdigit()判斷是否為十六進製制

其次十六進製制存在大寫a,小寫a,故為了統一,我們首先將其全部轉換為小寫處理

最後字元的轉換需要分兩種情況

(1)數字:和八進位制,十進位制一樣,將乘的數字改為16即可:

temp=x-『0』; res=res*16+temp; // 進行轉換,字元連線操作

(2)字元:將a->10,b->11;a的ascii碼為97,b為98,所以我們可以:『b』-『a』+10=98-97+10=11進行轉換,所以字元公式為:

temp=x-『a』+10;res=res*16+temp

那麼整個十六進製制處理流程為:

這就是實現這個函式的模組,我們可以用一張圖來描述解決這個問題的整體思路:

那我們給出**:

//修改錯誤函式

char

change

(char x)

return s;

}int

dec(

const

char

* str,

int len,

int res,

int temp,

int index,

int flag)

//處理十進位制

temp=x-

'0';

if(res > int_max /

10||

(res == int_max/

10&& temp >7)

) res=res*

10+temp;

}return res;

}int

hex(

const

char

* str,

int len,

int res,

int temp,

int index)

//處理十六進製制

else

//字元

}else

break;}

return res;

}int

oct(

const

char

* str,

int len,

int res,

int temp,

int index)

//處理八進位制

else

break;}

return res;

}int

my_atoi

(const

char

*str)

index++;}

if(str[index]

!='0'

)//不存在十六進製制,八進位制

else

//處理十六進製制,八進位制

else

//八進位制}if

(flag)

//為負數

return res;

}int

main()

執行結果如下:

加油哦!?。

整數轉化為字串和字串轉化為整數

整數轉化為字串 includeint main temp i 0 為什麼等於0就可以,因為將temp定義為字串陣列後,等號右邊的數相當於ascii碼值,0就相當於 0 如果寫為61,輸出就為 12345 printf s temp i i 1 while i 0 str j temp i str j...

字串轉化為整數

字串轉化為整數需要注意以下幾個問題 1.檢測非法輸入 2.空串 空指標 3.判斷數字的正負 4.處理數字的上下溢位。因為整數是有範圍的。include long long strtointcore const char digit,bool minus enum status int g nstat...

字串轉化為整數值

思路分析 首先判斷字串是否為空,返回0 考慮前面的是否是空格,使用trim 去掉,然後判斷長度是否為0,是的話,返回0 判斷第乙個字元是不是 和 設定變數sign記錄 迴圈取得字串的數字,考慮字串中有非數字,遇到就退出,保留前面的數字 考慮溢位的情況,溢位返回integer的最大值或最小值 publ...