Printf function who returning an array of int

心不动则不痛 提交于 2021-01-28 05:34:09

问题


I'm trying this exercice but I don't know how to printf my function in main. Exercice: 1) Write a function who returning an int tab with all values between min and 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);
}

回答1:


returning an int tab with all values between min and max

Depending on the idea of "between", it is an open question if the end values should be included. Given OP's mis-coded +1 in sizeof(*tab) * len + 1, I'll go with the idea both ends should be included.

Miscalculation of len

Rather than loop, simply subtract

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

Allocation miscalculated

Good to use sizeof *pointer, yet the + 1 makes little sense. If anything the ... * len + 1 should have been ... * (len + 1). Yet the +1 is handled with the above fix. Also cast not needed in C.

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

Wrong assignment

Code repeatedly assigned the same *tab location.

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

No allocation error checking nor min, max validation

Potential for int overflow with mix - min

Be sure to free allocations


Alternative

#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:


  • inside "ft_range", when you are trying to calculate the length the array needs to do, all you have to do is subtract the minimum from the maximum. what you did is much slower and unnecessary.

  • when allocating memory, you did not need to add a "+1" at the end. you may have seen it done in other examples, but it does not apply here.

  • the "while" loop inside "ft_range" needs to have a "<=" sign, otherwise it will stop before it reaches the "max" value.

  • when adding a value to the "tab" int array, you are always doing so by dereferencing it (putting a "*" before it), so every one of your values will come on the first position of the array and overwrite themselves. you need to have another "int i" to keep track of the current index of the array.

  • make sure to free the memory you allocated with "malloc" after you finish your enumeration. it does not matter right now, but if you ever get to writing more complex programs you will need to do so to keep the performance up, which can be critical.

here's a working code, with a few comments (i'm shit at comments, if you don't understand them, just ask me bro)

#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);
}


来源:https://stackoverflow.com/questions/61870571/printf-function-who-returning-an-array-of-int

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!