Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从c中的数组中删除重复元素,can';不要修改变量_C_Duplicates - Fatal编程技术网

从c中的数组中删除重复元素,can';不要修改变量

从c中的数组中删除重复元素,can';不要修改变量,c,duplicates,C,Duplicates,您好,我想知道为什么我无法在以下情况下更改变量“cinter”的值: 编辑:@Arash这是一个你可以运行的代码,我只需要在删除重复项的同时更改cinter的值,这样我以后就可以使用它准确地知道我的数组中有多少相关项 #include <stdio.h> #include <stdlib.h> #include <assert.h> static int compare (void const *a, void const *

您好,我想知道为什么我无法在以下情况下更改变量“cinter”的值:

编辑:@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;
}
#包括
#包括
#包括
静态整数比较(无效常数*a,无效常数*b){
int const*pa=a;
int const*pb=b;
返回*pa-*pb;
}
void main(){
int nbObjets=7,*int;
大小不一;
尺寸i,j;
printf(“\n数组中有多少个元素:”);
scanf(“%d”和“&cinter”);
inter=malloc(nbObjets*sizeof(int));
printf(“\n输入元素:”);

对于(i=0;i,您可以使用pass by address来解决问题:

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

您尝试在
void
函数的末尾返回新的大小。编译器没有抱怨吗?将其设置为
int
(顺便说一句,不是
size\u t

(顺便说一句:在Q中抛出这样一个未格式化的代码不是很有帮助。)

当然,在
main()
中,您应该将返回值指定给
cinter
或其他任何对象

cinter = noDuplicate(inter, cinter);

您的编译器对您的代码有什么看法?…以及“cinter”的声明在哪里?它是什么类型的?我想知道为什么
inter=malloc(nbObject*sizeof(int))
忽略刚刚输入的
cinter
的值,然后在循环中使用以索引
inter
。如果编译器发现
void noDuplicate(int arr[],size\u t size){[…]返回size;}
你需要换一个新的。更改你的帖子不符合礼仪。如果需要,添加编辑。你的帖子现在会过时一些答案。建议还原。为什么在返回时使用间接寻址可以解决问题?因为OP也会修改数组本身。所以我将这两个参数都设置为pass-by-address。第一个参数是指针,而不是指针数组。你不能在C中传递数组。因此它永远不会更改。此外,指针也不会更改。但是,这根本不是原因。例如,你通过传递预定义大小数组的文本会遇到问题。好的。它会衰减为指针。Edited。我想这两种方法都可以:按地址传递
cinter
,或者返回更新的v值。第一个参数是指针,因为数组会衰减为指针。使用C必须精确。再说一次:如果返回值可以完成交易,为什么要添加一个间接级别?这完全没有好处,但至少有两个缺点。我将大小更改为int,将函数中的void也更改为int,还添加了cinter=no重复(中间、中间);基本上都没有用,cinter保留它的初始值…感谢你指出我的一些错误,并为未格式化的代码感到抱歉我对论坛还是新手,不知道如何正确使用工具。我真的不理解你的评论。请将新代码添加到你的Q中。j+1的评估值是否达到预期值?什么值e您是否看到将数组索引类型从
size\t
更改为
int
?@AminNegm Awad它现在已编辑,我已进行了您请求的更改,结果实际上与原始代码相同(当函数仍然无效且返回时…)
cinter
的值保持不变,尝试将值返回到main中的
cinter
无效。您调用了函数两次。您不想这样做。
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);
int noDuplicate( int arr[],size_t size )
{
cinter = noDuplicate(inter, cinter);