c - 从c中的数组中删除重复元素,无法修改变量

标签 c duplicates

嗨,我想知道为什么我无法更改变量“cinter”的值:

    int nbobject=7, cinter, i, *inter;

    printf("\nHow many elements in array :");
    scanf("%d", &cinter);
    inter=malloc(nbObject*sizeof(int));
    printf("\nEnter the elements :");
    for(i=0;i<cinter;i++){
       scanf("%d",&inter[i]);
    }
    qsort(inter, cinter, sizeof *inter, compare);
    noDuplicate(inter, cinter);
    cinter=noDuplicate(inter,cinter);
    for(i=0;i<cinter;i++){
        printf("%d", inter[i]);
    }
    printf("\nNumber of elements in array : ");
    printf("%d", cinter);
    printf("\nArray elements : ");
    for (i=0;i<cinter;i++){
       printf("%d ", inter[i]);
    }



   int noDuplicate( int arr[],int size ){
        int i=0, j=0;
        for (i = 1; i < size; i++){
           if (arr[i] != arr[j]){
              j++;
              arr[j] = arr[i]; // Move it to the front
           }
        }

        // The new array size..
        size = (j + 1);
        return size;

        }

所以我所做的只是对数组进行排序并删除重复项。我希望变量“cinter”将数组中的元素数量减去删除的元素数量,以便稍后我可以使用它来了解数组中有多少相关元素,但无论我总是最终得到相同的数字。

输出:

How many elements in array : 6
Enter the elements : 2 1 2 3 5 1
Number of elements in array : 6
Array elements : 1 2 3 5 3 5

编辑:@Arash 这是您可以运行的代码,我所需要的只是能够在删除重复项时更改 cinter 的值,以便稍后可以使用它来确切地知道我的数组中有多少相关项目。

    #include <stdio.h>
    #include <stdlib.h>
    #include <assert.h>

    static int compare (void const *a, void const *b){
       int const *pa = a;
       int const *pb = b;
       return *pa - *pb;
    }

void main(){
    int  nbObjets=7, *inter;
    size_t cinter;
    size_t i, j;

    printf("\nHow many elements in the array :");
    scanf("%d", &cinter);
    inter=malloc(nbObjets*sizeof(int));
    printf("\nEnter the elements :");
    for(i=0;i<cinter;i++){
        scanf("%d",&inter[i]);
    }
    qsort(inter, cinter, sizeof *inter, compare);
    noDuplicate(inter, cinter);
    cinter=noDuplicate(inter, cinter);
    printf("\nNumber of elements in the array (cinter) : ");
    printf("%d", cinter);
    printf("\nArray elements : ");
    for (i=0;i<cinter;i++){
        printf("%d ", inter[i]);
    }
}


int noDuplicate( int arr[], size_t size ){
    size_t i=0, j=0;
    for (i = 1; i < size; i++){
        if (arr[i] != arr[j]){
            j++;
            arr[j] = arr[i]; // Move it to the front
        }
   }

   // The new array size..
    size = (j + 1);
    return size;
}

编辑:我通过进行 Arash 告诉我要做的更改来使其正常工作,感谢大家的帮助!

最佳答案

您可以使用传递地址来解决问题:

void noDuplicate( int arr[],size_t *size ){
    size_t i=0, j=0;
    for (i = 1; i < *size; i++){
      if (arr[i] != arr[j]) {
        j++;
        arr[j] = arr[i]; // Move it to the front
      }
    }
    // The new array size..
    *size = (j + 1);
   } 

然后你这样调用它:

 noDuplicate(inter, &cinter);

关于c - 从c中的数组中删除重复元素,无法修改变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43551360/

相关文章:

c++ - 计算轮廓的 x,y 轴长度

c - 带 double 的 SSE,不值得吗?

c - C 中的共享内存变量,extern 关键字

c - 是否有检查名为 sptr 的 sockaddr* 是否指向 ipv4 或 ipv6 地址的函数?

mysql self 加入group_concat并且没有重复

google-analytics - 谷歌分析重复交易

c - 重新声明全局变量与局部变量

constructor - 如何解决 Haxe 中的 'Duplicate Constructor' 错误?

在日期过滤器中使用多个月份时,行不合并 R 中的重复项

python - 我需要读取 CSV 文件,然后写入一个包含 0 个重复项的新 CSV 文件