2015-07-22 3 views
1
#include<stdio.h> 

int ft_atoi(char *str) 
{ 
    int i; 
    int sign; 
    int val; 
    int nbr; 

    i = 0; 
    sign = 1; 
    val = 0; 
    nbr = 0; 
    while(str[i] != '\0') 
    { 
     if (str[i] == '-') 
      sign = -sign; 
     i++; 
    } 
    i = 0; 
    while(str[i] >= '0' && str[i] <= '9' && str[i] != '\0') 
    { 
     nbr = (int) (str[i] - '0'); 
     val = (val * 10) + nbr; 
     i++; 
    } 
    i++; 
    return (val * sign); 
} 

Он возвращает 0, когда я пытаюсь использовать отрицательные числа.Почему моя реализация atoi не работает с отрицательными числами?

+1

Дело в том, что у вас есть -ve номер, который не проходит внутри цикла. вы должны проверить, является ли первый символ '-', вы должны сделать' i ++ ', чтобы он мог получить следующий символ. – Himanshu

+0

Помимо того, что вы являетесь источником вашей проблемы, цикл дважды является огромной тратой. О, и вы действительно должны передать 'const char *', так как не ожидается, что такая функция изменит содержимое строки. Посмотрите, как [упрощает все с помощью всего одного цикла] (http://coliru.stacked-crooked.com/a/a08491d633f7fb7e) –

+0

Забыл включить чек на цифру, конечно, должен [выглядеть так] (http: /coliru.stacked-crooked.com/a/5327f86dd3fd7388) –

ответ

3

второй раз, когда цикл разрывается, если str[0] - '-'.

while(str[i] != '\0') 
{ 
    if (str[i] == '-') 
     sign = -sign; 
    i++; 
} 

должен быть

if (str[0] == '-') 
{ 
    sign = -1; 
    str++; 
} 
+0

Спасибо, друг! теперь он работает отлично. –

1

После сканируются строки для минуса, вы сбрасываете i к нулю, но str[0] не является допустимой цифра, потому что это знак минус.

Вы можете изменить первую петлю для продвижения мимо первого знака минуса и начал разбор численное значения из которых первой петля кончила:

int ft_atoi(char *str) 
{ 
    int i = 0; 
    int sign = 1; 
    int val = 0; 

    while (str[i] == '-') { 
     sign = -sign; 
     i++; 
    } 

    while(str[i] >= '0' && str[i] <= '9') 
    { 
     int nbr = (int) (str[i] - '0'); 

     val = (val * 10) + nbr; 
     i++; 
    } 

    return (val * sign); 
} 

(Там нет необходимости проверять, что str[i] не является нулевой символ, потому что, если это знак минус или цифра, он не может быть нулевым символом. Однако проверка полезна для тестирования негативов, например, при проверке того, что какой-то символ не является минусом.)

+0

Не нужно использовать первый цикл while. вы можете использовать 'if' вместо этого. bcz будет только один символ '-'. – Himanshu

+1

@ Химаншу: Да, но я работал над кодом OP. Это будет анализировать «-23» как положительный 23. Как он был закодирован в исходном посте, я не уверен, что это было предназначено. –

+0

@M Oehm, хорошая мысль. 2-значный знак. – Himanshu

0

вы можете просто str++; в вашем случае, если str отрицательна

#include <stdio.h> 
int ft_atoi(char *str) 
{ 
    int i; 
    int sign; 
    int val; 
    int nbr; 



     i = 0; 
     sign = 1; 
     val = 0; 
     nbr = 0; 
     while(str[i] != '\0') 
     { 
      if (str[i] == '-') 
      { 

       sign = -sign; 
       str++; 
      } 
      i++; 
     } 
     i = 0; 
     while(str[i] >= '0' && str[i] <= '9' && str[i] != '\0') 
     { 
      nbr = (int) (str[i] - '0'); 
      val = (val * 10) + nbr; 
      i++; 
     } 
     i++; 
     return (val * sign); 
    } 
Смежные вопросы