【问题标题】:Get all the divisors for a number in C获取C中一个数字的所有除数
【发布时间】:2012-03-11 16:16:48
【问题描述】:

我正在尝试构建一个接受 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;
}

这适用于 22、33、77 等数字,但不适用于 66 或 88(它只是卡在某个地方)。谁能帮帮我?

【问题讨论】:

  • 内存分配对我来说毫无意义。我很惊讶它完全有效..
  • 1) 不要转换malloc 的结果,2) 因为sizeof(char) == 1,你不必明确地拼出来。
  • 您可以通过使用调试器或通过添加 printf 语句来跟踪进度来找出卡住的位置。
  • 包含 1 个元素的空格的字符串(您的 malloc(sizeof(char)))只能是空字符串:元素 必须 是 NUL 终止符;或者它不再是一个字符串......如果它不是一个字符串,你就不能在接受字符串的函数中可靠地使用它(比如sprintf())。
  • @pmg 我将 sizeof(char) 替换为虚拟的 100 值。但除此之外,该功能似乎做对了吗?我对 C 数据类型(指针等)不是很熟悉,所以这就是我要问的原因。

标签: c pointers gcc


【解决方案1】:

这么小的空间里有这么多问题……天哪!

我们先想想接口……调用代码怎么知道返回了多少个值?据推测,指针数组的末尾必须有一个空指针。此外,对于每个大于 1 的数字,我们知道 1 和数字本身将是除数,因此我们需要返回一个至少包含 3 个指针的数组。如果一个数字不是素数或一,那么将有更多的值推入数组。因此,我们需要做的一件事是密切关注数组中有多少值。此外,内存释放代码将需要遍历返回的数组,在整个释放数组之前释放每个字符串。

所以,我们对代码应该做什么有了一些想法。您的代码对此有何影响?

char** calc_div(char nr[100])
{
    int nri,i,ct=0;
    char **a = (char**)malloc(sizeof(char*));

这会在返回数组中分配一个条目。我们现在知道我们需要至少 3 倍的空间,而且我们还必须记录分配了多少空间。

    nri = atoi(nr);

    for(i=0;i<sizeof(char*);i++)
        a[i] = (char*)malloc(sizeof(char));

这会分配 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);
        }

if 语句主体内的代码必须准备好在必要时为新因子和数组分配内存。

    return a;
}

【讨论】:

    【解决方案2】:

    之后

    char **a = (char**)malloc(sizeof(char*));
    

    a 有空间容纳 1 个指向 char 的指针 ...

    for(i=0;i<sizeof(char*);i++)
        a[i] = (char*)malloc(sizeof(char));
    

    但您尝试写入的不仅仅是单个元素(除非 sizeof(char*) 恰好是 1)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-13
      • 1970-01-01
      相关资源
      最近更新 更多