我尝试拆分一个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++;
}
}
}
如果有人可以告诉我我做错了什么,将大有帮助。
答案 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
元素。