我必须创建一个给定的函数,允许我将给定字符串(自制@atoi)的数字转换为给定的基数(2,8,16等)并返回结果:赋值
问题是,我认为我的函数是好的,但它得到SIGABORTs无处不在,因为确实,我似乎无法初始化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] == ' ' || base[1] == ' ')
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,但几乎没有成功(因为我不愿意分配内存?)
我复制了您的代码,清理了一些不能让我编译代码的注释,编译了代码,然后运行了示例。示例代码在没有任何程序转储的情况下运行。但是,当我将值的大小增加到如下值时:
printf("%d", ft_atoi_base("10101010", "01"));
我得到了一个堆栈粉碎错误,这意味着某些语句正在填充超过其边界的数组。
检查代码,我发现你标记了一行可疑的代码。
int nbr_final[(sizeof(int))]; // I think that this is the troublemaker*
而且,你的怀疑是正确的。
我添加了几个printf语句作为终端级调试器,以跟踪从ft_putnumber_base函数中的字符串派生的整数值的处理。
int ft_putnbr_base(int nbr, char *base)
{
int size_base;
printf("Size of integer: %ldn", sizeof(int)); /* To note the actual size value of an int */
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)
{
printf("nbr is: %d and i is: %dn", nbr, i); /* To track the stack smashing */
nbr_final[i++] = nbr % size_base;
nbr = nbr / size_base;
}
while (--i >= 0)
final = final * 10 + nbr_final[i];
}
return (final);
}
在此基础上,我用更大的整数重新运行代码,并生成了以下终端输出:
@Dev:~/C_Programs/Console/Homemade/bin/Release$ ./Homemade
Size of integer: 4
nbr is: 10101010 and i is: 0
nbr is: 5050505 and i is: 1
nbr is: 2525252 and i is: 2
nbr is: 1262626 and i is: 3
nbr is: 631313 and i is: 4
nbr is: 315656 and i is: 5
nbr is: 157828 and i is: 6
nbr is: 78914 and i is: 7
nbr is: 39457 and i is: 8
nbr is: 19728 and i is: 9
nbr is: 9864 and i is: 10
nbr is: 4932 and i is: 11
nbr is: 2466 and i is: 12
nbr is: 1233 and i is: 13
nbr is: 616 and i is: 14
nbr is: 308 and i is: 15
nbr is: 154 and i is: 16
nbr is: 77 and i is: 17
nbr is: 38 and i is: 18
nbr is: 19 and i is: 19
nbr is: 9 and i is: 20
nbr is: 4 and i is: 21
nbr is: 2 and i is: 22
nbr is: 1 and i is: 23
*** stack smashing detected ***: terminated
Aborted (core dumped)
我猜这段代码可能有更多的问题,但这是最突出的一个。先把注意力集中在那里,看看你能不能进步。