c - 从动态数组 C 中删除元素

标签 c

我正在为我的类(class)做一些练习,但我遇到了一个问题。 练习要求用文件中的数据填充动态数组,对数据进行排序,然后删除重复数据。 我的问题在最后一个,我无法删除重复的数字。

这是我的代码:

int main(){
    FILE *f;
    int *v;
    int n=0,i,j;

    f=fopen("InteirosComRepetidos.txt","r");
    v=(int*)malloc(sizeof(int));

    while(!feof(f)){
        v=(int*)realloc(v,(n+1)*sizeof(int));
        fscanf(f,"%d\n",&v[n]);
        n++;
    }

    OrdenarQuicksort(v,0,n);

    for(i=0;i<n;i++){
        printf("%d\n",v[i]);
    }
    //Trying to remove the duplicate
    for(j=n;j>=0;j--){
        if(v[j]==v[j-1])
            v=(int*)realloc(v,(n-1)*sizeof(int));
    }

    printf("Retirados:\n");
    for(i=0;i<n;i++){
        printf("%d\n",v[i]);
    }
    system("pause");
    return 0;}  

谁能帮帮我?

最佳答案

这个:

for(j=n;j>=0;j--){
    ...
}

应该是:

for(j=n-1;j>=0;j--){
    ...
}

否则你就出界了。

比这个:

if(v[j]==v[j-1])
     v=(int*)realloc(v,(n-1)*sizeof(int));

正在重新分配但不删除 double 。意思是如果你有

1 2 2 5

这段代码所做的就是删除 5 所以你最终会得到

1 2 2

如果您重新分配和缩小内存中的数组不会移动,它会留在原处,因此在许多情况下您仍然可以访问 5

关于c - 从动态数组 C 中删除元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50595146/

相关文章:

c++ - 如何更改我的 C++ 代码以使其可在 C 中使用?

将文本文件的数据转换为变量

c - 尝试运行一个程序,在运行函数 copyij() 和 copyji() 后以秒为单位跟踪耗时

c - 从 c 数组索引问题中的串行端口读取该数据

c++ - 如何检查 tiff 文件的无效格式错误

c - 这个语句说明了什么,请解释 if(!(!x) && x)

c - 在 Windows 10 系统上从 C 中的 getchar() 读取 EOF

c - 如何使用 SIGALRM 终止程序

c - 使用O_CREAT时open的执行

c - 计算错误? C编程初学者