[問題] C語言實作atoi

作者: penril0326   2014-11-13 01:02:44
各位大大好,小弟最近在練程式實作atoi這個function
卻發生一個問題我怎麼想都不知道錯在哪
atoi是把一個字串轉成int型態
我的錯誤是如果我的字串是 char s[]="-123";
結果輸出會是-122,也就是說我目前唯一發現有問題的地方是
只要輸入是"負號且3位數",結果就會少1
(ex:-987變成-986)
非3位數跟正整數就不會有這問題
叫朋友幫我編譯他說他沒問題
但我自己的電腦跟學校電腦都會這樣
想請版上高手幫我解答,我使用的編譯器是code::blocks
以下是code
int Myatoi(char* s)
{
int sum=0,i=0,count1=0;
int j,lenght,count2;
lenght = strlen(s);
if (s[0] != '-')
{
if (s[0] < '0' && s[0] > '9')
{
return 0;
}
else
{
while (s[i] >= '0' && s[i] <= '9')
{
count1++;
i++;
}
count2 = count1 - 1;
for (j=0;j<count1;j++)
{
sum = sum + ((int)(s[j] - '0')) * pow(10,count2);
count2
作者: KoenigseggG (地表最速)   2014-11-13 01:21:00
你可以加入一些printf看看哪裡出錯了是說 if (s[0] < '0' && s[0] > '9') 這不會true吧當然啦~學習用 debugger 很重要。
作者: LPH66 (-6.2598534e+18f)   2014-11-13 01:36:00
我覺得問題是在 pow(10,count2) 上, 這是浮點數函數所以不保證回傳回來的浮點數會正好整數, 在轉成 int 時截掉小數就造成誤差了;其實你可以不用 pow 來寫的提示: 想想怎麼從 12 和 3 算出 123 來
作者: carylorrk (carylorrk)   2014-11-13 02:02:00
讓我想到有人說,學習一個語言的 debug 方式才能說你學過這個語言XD
作者: PoorLoser (廢文製造機)   2014-11-13 02:18:00
1. pow() 回傳 float2. int * float 會轉型成 float * float3. pow() 指數浮點運算有精度問題, 可能回傳 999.99...4. 假設輸入 456, 可能得到 455.9999XX... ...5. 再轉型成 int, 捨棄小數就少了 1不過正整數沒問題就有點怪
作者: phishingphi (hsnutontu)   2014-11-13 02:57:00
什麼時候code::blocks是編譯器...devC這個...應該不妥吧, code應該有問題.
作者: Caesar08 (Caesar)   2014-11-13 05:45:00
我想給個建議,你可以先把-從字串裡面移除,這樣你就不用寫2段一模一樣的code
作者: KoenigseggG (地表最速)   2014-11-13 07:35:00
他想說c::b是IDE吧。其實我昨晚用你code測-123是對的(gcc 4.8.1), float pow()這我沒注意到艸我還是認為不會true啊~雖然問題應該不在這0.0讓我想到大一考試,同一份code, c::b跑出TA給的答案工作站(linux)直接Segmentation fault......從此拋棄c::b(?)是說為啥跟下面那篇都會想用pow()做啊0.0需求是轉int就像LPH大大說的那樣
作者: dirkc (3781615)   2014-11-13 09:22:00
的確pow,strlen都不需要,另外原始atoi()可以處理前綴空白atoi也有考慮INT_MAX/INT_MIN; 不過簡化難度來練習也不錯:)
作者: KoenigseggG (地表最速)   2014-11-13 22:01:00
'0' -> 48, '9' -> 57. 不會 97 < 48 && 97 > 57.還是我哪裡錯艸。我用vim+gcc喔~我也不知為何會這樣LPH大大應該是說 12 * 10 + 3 = 123?嗯,害我每次推文前都再查一次表XD說不定真的沒這麼簡單@@因為那是我的作法,我猜的
作者: dirkc (3781615)   2014-11-14 09:08:00
如樓上所說,if/while就可以做了,沒什麼高深的語法
作者: Jimmy0301 (Jimmy)   2014-11-17 23:56:00
其實判斷空白可以用 isspace,判斷是否為數字 isdigit這我寫的但不一定對http://codepad.org/T4bO1QeU

Links booklink

Contact Us: admin [ a t ] ucptt.com