在C函数中分割一个int数组并返回2个不同的数组

时间:2019-07-16 15:06:15

标签: c

我尝试拆分一个int数组。该数组包含正数和负数,我希望函数返回2个数组,一个数组为正数,另一个数组为负数。

我已经尝试了以下代码,但是无法正常工作。

 int main(void)
    {
            int array[] = {1, -1, 2, 3, 4, -5, 6};
            int cnt = sizeof(array)/sizeof(array[0]);
            int *neg, *pos;
            int **low = &neg;
            int **high = &pos;

            neg = (int*) malloc(sizeof(int) * 2);
            pos = (int*) malloc(sizeof(int) * 5);

            sort(array, cnt, low, high);

            for(int i = 0; i < 5; i++)
            {
                   printf("%3d\n", pos[i]);
            }

            //same for negative array

            return 0;

    }

    int sort(int *arr, int cnt, int **low, int **high)
    {
          for(int i = 0; i < cnt; i++)
          {
               if(arr[i] > 0)
               {
                   *high[0] = arr[i];
                   **high++;
               }
               else
               {
                   *low[0] = arr[i];
                   **low++;
               }
          }
    }

如果有人可以告诉我我做错了什么,将大有帮助。

1 个答案:

答案 0 :(得分:2)

如评论中所述,int**的双重间接访问是不必要的。下面显示了该功能的一个更合适的界面。 它以数组和计数作为输入,并指向足够大的输出数组。作为输出,数组将使用正(负)值填充,并且每个数组的计数都将写入*npos*nneg)。

零的处理留给您。只需编辑if条件。

还要注意我如何使用*npos += 1而不是(*npos)++来避免运算符优先级的错误。

void separate(int *arr, int cnt, int *neg, int *pos, int *nneg, int *npos)
{
    *nneg = 0;
    *npos = 0;

    for(int i = 0; i < cnt; i++)
    {
        if (arr[i] > 0)
        {
            pos[*npos] = arr[i];
            *npos += 1;
        }
        else if (arr[i] < 0)
        {
            neg[*nneg] = arr[i];
            *nneg += 1;
        }
    }
}

虽然在您的示例中您知道有多少个正值和负值,但通常应该分配绝对足够大的数组,即cnt元素。