从 C 中的数组创建一个没有重复整数的新数组

标签 c arrays

我被要求创建一个没有重复整数的新数组。

我想我在我的代码中犯了一个错误,但没有注意到任何错误。

“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;
}

这将永远不会有另一个迭代。它将从第一次迭代返回 truefalse。当您使用循环时,这不是您计划的。

根据您的设计,您可能希望将 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/

相关文章:

c - 求给定 Int 的总和但忽略重复的数字

c++ - Arduino 中不需要的符号扩展

c++ - C 或 C++ : for loop variable

javascript - 使用标题破坏

c - 是否打开了一个文件来代替缓冲的 stderr?

c - C 程序的意外行为

c - 声明没有最高维度的数组

c - 无法将数组从 FORTRAN 传递到 C

C++ - 将项目添加到排序数组的最快方法

javascript - 尝试将提示中的输入用作函数中的对象值