這道題是在劍指 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...