我正在尝试构建一个需要1个参数的函数:数字为char []并返回一个以除数作为字符串的char**.
我已经提出了以下功能,它只适用于某些数字.
char** calc_div(char nr[100])
{
int nri,i,ct=0;
char **a = (char**)malloc(sizeof(char*));
nri = atoi(nr);
for(i=0;i<sizeof(char*);i++)
a[i] = (char*)malloc(sizeof(char));
for(i=1;i<=nri;i++)
if(nri % i == 0)
{
sprintf(a[ct++],"%d",i);
}
return a;
}
Run Code Online (Sandbox Code Playgroud)
这适用于22,33,77这样的数字,但不适用于66或88(它只是卡在某处).谁能帮助我?
这么小的空间里有这么多问题......亲爱的!
让我们首先考虑一下接口......调用代码如何知道返回多少个值?据推测,指针数组的末尾必须有一个空指针.此外,对于大于1的每个数字,我们知道1和数字本身将是除数,因此我们需要返回至少3个指针的数组.如果一个数字不是素数或一个,那么将有更多的值推入数组.因此,我们需要做的一件事就是密切关注数组中有多少个值.此外,内存释放代码将需要逐步执行返回的数组,在释放整个数组之前释放每个字符串.
因此,我们得到了一些关于代码应该做什么的想法.你的代码如何反对这个?
char** calc_div(char nr[100])
{
int nri,i,ct=0;
char **a = (char**)malloc(sizeof(char*));
Run Code Online (Sandbox Code Playgroud)
这会在返回数组中分配一个条目.我们现在知道我们需要至少3倍的空间,我们还必须记录分配的空间.
nri = atoi(nr);
for(i=0;i<sizeof(char*);i++)
a[i] = (char*)malloc(sizeof(char));
Run Code Online (Sandbox Code Playgroud)
这将分配4或8个大小为1字节的字符串,将它们分配给先前分配的大小为1的数组的连续元素.这是阵列上保证的缓冲区溢出a.另外,因为字符串只有大到足以在字符串末尾保存空值,所以你不能在那里放任何答案.您可能应该分配strlen(nr)+1字节,因为这nr是您需要的数字之一.很明显,数字仅限于3或7个因子(因为您还需要允许终止空指针).
for(i=1;i<=nri;i++)
if(nri % i == 0)
{
sprintf(a[ct++],"%d",i);
}
Run Code Online (Sandbox Code Playgroud)
if语句正文中的代码必须准备好在必要时为新因子和数组进行内存分配.
return a;
}
Run Code Online (Sandbox Code Playgroud)