从c中的数组中删除重复元素,can';不要修改变量
您好,我想知道为什么我无法在以下情况下更改变量“cinter”的值: 编辑:@Arash这是一个你可以运行的代码,我只需要在删除重复项的同时更改cinter的值,这样我以后就可以使用它准确地知道我的数组中有多少相关项从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 *
#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);