我必须创建一个给定的函数,它允许我将一个给定的数字字符串(homesize @atoi)转换为一个给定的基数(2、8、16等),并返回结果:assignment
问题是,我认为我的函数是好的,但后来它得到SIGABORT无处不在,因为事实上,我似乎无法初始化INT[]与一个有效的大小。
这是我的密码
#include <stdio.h>
int ft_atoi(char *str)
{
int i;
int sign;
int num;
i = -1;
sign = 1;
num = 0;
while (str[++i] < '0' || str[i] > '9')
if (str[i] == '-')
sign *= -1;
while (str[i] >= '0' && str[i] <= '9')
num = num * 10 + str[i++] - '0';
return (num * sign);
}
int check_base(char *base)
{
int i;
int z;
i = -1;
z = 0;
if (base[0] == '\0' || base[1] == '\0')
return (0);
while (base[++i])
{
z = i + 1;
if (base[i] == '+' || base[i] == '-')
return (0);
if (base[i] < 32 || base[i] > 126)
return (0);
while (base[z++])
{
if (base[i] == base[z])
return (0);
}
}
return (1);
}
int ft_putnbr_base(int nbr, char *base)
{
int size_base;
int nbr_final[(sizeof(int))]; *// I think that this is the troublemaker*
int i;
int final;
i = 0;
final = 0;
size_base = 0;
if (check_base(base))
{
if (nbr < 0)
nbr = -nbr;
while (base[size_base])
size_base++;
while (nbr)
{
nbr_final[i++] = nbr % size_base;
nbr = nbr / size_base;
}
while (--i >= 0)
final = final * 10 + nbr_final[i];
}
return (final);
}
int ft_atoi_base(char *str, char *base)
{
return (ft_putnbr_base(ft_atoi(str), base));
}
int main(void)
{
printf("%d", ft_atoi_base("10", "01")); *// <== Here is where trouble begins, as soon as **str** starts to grow it fails*
}
我确实尝试过使用 valgrind 和 gdb,但几乎没有成功(因为我不愿意分配内存?)
1条答案
按热度按时间lnlaulya1#
我复制了你的代码,清除了一些不允许我编译代码的注解,编译了代码,然后运行了示例。示例代码运行时没有任何程序转储。但是,当我将值的大小增加到以下值时:
我得到了一个堆栈粉碎错误,这意味着某个语句填充数组时超出了它的边界。
检查代码时,我看到您将一行代码标记为可疑。
你的怀疑是正确的。
我添加了几个printf语句作为终端级调试器,以跟踪从ft_putnumber_base函数中的字符串派生的整数值的处理。
然后,我用更大的整数重新运行代码,并产生了这个终端输出。
我猜这段代码可能还有更多的问题,但这是最突出的一个。先集中精力,看看你是否能取得进展。