为什么我的atoi实现不能使用负数?

时间:2015-07-22 10:40:40

标签: c atoi

#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.

3 个答案:

答案 0 :(得分:3)

如果str[0]'-',则第二个while循环中断。

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

应该是

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

答案 1 :(得分: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]是不是空字符,因为如果它是减号或数字,则它不能是空字符。该检查对于测试底片很有用,但是,例如,当测试某些字符不是负数时。)

答案 2 :(得分: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);
    }