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

C 为什么我的atoi实现不能使用负数?,c,atoi,C,Atoi,当我尝试使用负数时,它返回0。如果str[0]是“-”,则第二个while循环将中断 应该是 while(str[i] != '\0') { if (str[i] == '-') sign = -sign; i++; } 扫描字符串中的减号后,可以将i重置为零,但str[0]不是有效数字,因为它是减号 您可以将第一个循环更改为超过第一个减号,并从第一个循环停止的位置开始解析数值: if (str[0] == '-') { sign = -1; s

当我尝试使用负数时,它返回0。

如果str[0]是“-”,则第二个while循环将中断

应该是

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

扫描字符串中的减号后,可以将i重置为零,但str[0]不是有效数字,因为它是减号

您可以将第一个循环更改为超过第一个减号,并从第一个循环停止的位置开始解析数值:

if (str[0] == '-')
{
    sign = -1;
    str++;
}
不需要检查str[i]是否为空字符,因为如果它是减号或数字,则不能为空字符。但是,该检查对于测试负片非常有用,例如,当测试某个字符不是负号时。

您可以只使用str++;当str为负时,在if中

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);
}

问题是当你有-ve号码时,它不会在循环时进入。你应该检查第一个字符是否是-,你应该做i++这样它可以得到下一个字符。除了是问题的根源,循环两次也是一个巨大的浪费。哦,你真的应该传递一个const char*,因为这样的函数不会改变字符串内容。看看怎么忘记包括数字检查,当然ist不需要先使用while循环。你可以用if代替。bcz将只有一个字符。@Himanshu:是的,但我是为OP的代码工作的。这将把-23解析为正23。我不确定这是不是有意的,因为它在原始帖子中的编码方式。2-ve符号。@Himanshu:嗯,两个减号有点傻,真的。一个if就足够了,但代码可能应该去掉前导空格,并在开始时识别a+。
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);
}
#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);
    }