C 为什么我的atoi实现不能使用负数?
当我尝试使用负数时,它返回0。如果str[0]是“-”,则第二个while循环将中断 应该是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
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);
}