【问题标题】:Printf function who returning an array of int返回 int 数组的 Printf 函数
【发布时间】:2020-05-18 13:23:00
【问题描述】:

我正在尝试这个练习,但我不知道如何在 main.js 中打印我的函数。 练习: 1) 编写一个函数,该函数返回一个 int 选项卡,其中所有值都在 min 和 max 之间

#include <stdlib.h>
#include <stdio.h>

int *ft_range(int min, int max)
{
    int len;
    int *tab;

    len = min;
    while (len < max)
        len++;

    tab = (int *)malloc(sizeof(*tab) * len + 1);

    while (min < max)
    {
        *tab = min;
        min++;
    }
    return(tab);
}

int main()
{
    ft_range(0, 10);
    return(0);
}

【问题讨论】:

  • main 可能也需要知道len
  • 0 到 10 之间有多少个值?所以你不需要循环来确定len
  • 你正确地分配了你的表,但你总是只填充第一个元素。试试tab[i++]= min++;
  • 你返回tab。所以在main 你应该写int *tab= ft_range(0, 10); 这样的东西现在你可以使用循环来打印每个值。
  • BTW:ft_range 函数不太正确,有一个小而明显的错误。为你锻炼:找到它。

标签: c printf malloc


【解决方案1】:

返回一个包含最小值和最大值之间所有值的 int 选项卡

根据“介于”的概念,是否应包括最终值是一个悬而未决的问题。鉴于 OP 在 sizeof(*tab) * len + 1 中的错误编码 +1,我会同意两端都应该包括在内的想法。

len计算错误

而不是循环,简单地减去

//len = min;
//while (len < max)
//    len++;
len = max - min + 1;

分配错误

sizeof *pointer 很好用,但 + 1 没有什么意义。如果有的话,... * len + 1 应该是 ... * (len + 1)。然而,+1 是通过上述修复处理的。在 C 中也不需要强制转换。

// tab = (int *)malloc(sizeof(*tab) * len + 1);
tab = malloc(sizeof *tab * len);

分配错误

代码重复分配相同的*tab 位置。

//while (min < max)
//{
//    *tab = min;
//    min++;
//}
for (int i = min; i <= max; i++) {
  tab[i - min] = i;
}

没有分配错误检查和min, max验证

int 可能溢出mix - min

确保释放分配空间


另类

#include <stdlib.h>
#include <stdio.h>

int *ft_range(int min, int max) {
  if (min > max) {
    return NULL;
  }
  size_t len = (size_t)max - min + 1;

  int *tab = malloc(sizeof *tab * len);
  if (tab == NULL) {
    return NULL;
  }

  for (size_t i = 0; i < len; i++) {
    tab[i] = int(min + i);
  }

  return tab;
}

int main() {
    int mn = 0;
    int mx = 10;
    int *ft = ft_range(mn, mx);
    if (ft) {
      int *p = ft;
      for (int i = mn; i <= mx; i++) {
        printf("%d ", *p++);
      }
      free(ft);
    }
    return 0;
}

【讨论】:

    【解决方案2】:
    • 在“ft_range”中,当您尝试计算数组需要做的长度时,您所要做的就是从最大值中减去最小值。你所做的事情要慢得多,而且没有必要。

    • 在分配内存时,不需要在末尾添加“+1”。您可能已经在其他示例中看到过它,但在这里并不适用。

    • “ft_range”中的“while”循环需要有一个“

    • 1234563数组并覆盖自己。您需要另一个“int i”来跟踪数组的当前索引。
    • 确保在完成枚举后释放使用“malloc”分配的内存。现在没关系,但是如果您要编写更复杂的程序,则需要这样做以保持性能,这可能很关键。

    这是一个工作代码,有几个 cmets(我对 cme​​ts 很讨厌,如果你不明白,就问我兄弟)

    #include <stdlib.h>
    #include <stdio.h>
    
    int *ft_range(int min, int max)
    {
        int len;
        int * tab;
    
        len = max-min;
    
        tab = (int *)malloc(sizeof(*tab) * len);
    
        // create an index to track the position inside "tab"
        int i = 0;
    
        // sign needs to be "<=" so it does not stop before it reaches the max value
        while (min <= max)
        {
            tab[i] = min;
            // ++ needs to come before so the variable's value is updated right here
            ++min;
            // increase the i index to the next position in "tab"
            ++i;
        }
    
        return(tab);
    }
    
    int main()
    {
            int min = 5;
    int max = 10;
    int len = max-min;
    int * range = ft_range(min, max);
    
    for(int i = 0; i <= len; ++i)
        {
            // %d = integer
            // \n = move to next line
            printf("%d\n", range[i]);
        }
    
        getchar();
    
        return(0);
    }
    

    【讨论】:

    • len 减 1。考虑ft_range(42,42)。更深一层:max-min 可能会溢出。
    • 是的,有一些可以改进的地方,但它是 OPs 代码,所以我想让他开始。
    【解决方案3】:

    你正确地为表分配内存,你只需要通过你的标签使用循环在你的 main 中打印值,我编写的这段代码可以完美地工作。

        #include <stdlib.h>
    
    int *ft_range(int min, int max)
    {
        int *ptr;
        int mi;
        int i;
        int range;
    
        range = (max - min);
        mi = min;
        ptr = NULL;
        if (min > max)
            return (NULL);
        else
            ptr = malloc(sizeof(int) * range);
        i = 0;
        while (i < range)
        {
            ptr[i] = mi + i;
            i++;
        }
        return (ptr);
    }
    // #include <stdio.h>
    // int  main()
    // {
    //  //int i = 0;
    //  int min = 1;
    //  int max = 30;
    
    //  while(min < max)
    //  {
    //      printf("%d\n", *ft_range(min, max));
    //      min++;
    //  }
    // }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-26
      • 1970-01-01
      • 2018-06-12
      相关资源
      最近更新 更多