我被要求创建一个没有重复整数的新数组。
我想我在我的代码中犯了一个错误,但没有注意到任何错误。
“1, 2, 1, 2, 1, 4”的输出是“1, 2, 2, 4”。
应该是“1,2,4”
想了解我的错误。
// Exercise 2 -
void Ex2() {
int i, counter = 1, size = -1;
int* array = input_dynamic_array(&size);
int* newArr = (int*)malloc((size)* sizeof(int));
newArr[0] = array[0];
assert(array);
for (i = 1; i < size; i++) {
if (!find_num_in_newArr(newArr, size, array[i])) {
newArr[counter++] = array[i];
}
}
newArr = (int*)realloc(newArr, (counter)*sizeof(int));
printArray(newArr, counter);
free(array);
free(newArr);
}
bool find_num_in_newArr(int *newArr, int size, int num) {
int i;
for (i = 0; i < size; i++) {
if (newArr[i] == num) {
return true;
}
return false;
}
}
int* input_dynamic_array(int *size)
{
int *array;
int ii;
printf("Enter array size: ");
scanf("%d", size);
array = (int*)malloc((*size) * sizeof(int));
assert(array);
printf("Enter %d integer numbers: ", *size);
for (ii = 0; ii < *size; ii++)
scanf("%d", array + ii);
return array;
}
最佳答案
我在这里看到一个问题:
for (i = 0; i < size-1; i++)
{
if (newArr[i] == num)
{
return true;
}
return false;
}
这将永远不会有另一个迭代。它将从第一次迭代返回 true
或 false
。当您使用循环时,这不是您计划的。
根据您的设计,您可能希望将 return false;
移到循环之外。
另一个建议,Don't cast the return value of malloc
, its pointless .
此外,
int* newArr = (int*)malloc((size)* sizeof(int));
这之后需要进行检查。您需要检查 malloc
是否返回了 NULL
。如果是,则不会分配内存,任何基于 newArr
的修改都会很糟糕。
一种相对简洁的方法是使用如下所示的函数:
int RemoveDuplicates(int* Arr, int length)
{
int i = 0, j = 0;
int LengthChanged = 0;
for (i = 1; i < length; i++)
{
for(j = 0; j < LengthChanged ; j++)
{
if(Arr[i] == Arr[j])
break;
}
// Copy as is if there is not duplicate element in the array
if (j == LengthChanged )
Arr[LengthChanged++] = Arr[i];
}
return LengthChanged;
}
关于从 C 中的数组创建一个没有重复整数的新数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50272107/