Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.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:从完整阵列中删除,仅删除第一个重复实例_C_Arrays - Fatal编程技术网

C:从完整阵列中删除,仅删除第一个重复实例

C:从完整阵列中删除,仅删除第一个重复实例,c,arrays,C,Arrays,我有一个试图从中删除值的数组,但在尝试从数组中删除时遇到了两个问题: 1.)当我尝试从已满的数组中删除时,我会检测到一个*堆栈崩溃*错误 2.)当我的数组有多个副本时,我只想删除第一个实例,但它似乎删除了随机数目的实例 我为remove函数编写的代码如下: int Remove(int* array, int arrayLen, int removeNum) { int i, j; for (i = 0; i < arrayLen; i++) { if (array[i]

我有一个试图从中删除值的数组,但在尝试从数组中删除时遇到了两个问题:

1.)当我尝试从已满的数组中删除时,我会检测到一个*堆栈崩溃*错误

2.)当我的数组有多个副本时,我只想删除第一个实例,但它似乎删除了随机数目的实例

我为remove函数编写的代码如下:

int Remove(int* array, int arrayLen, int removeNum)
{
   int i, j;

for (i = 0; i < arrayLen; i++)
 {
   if (array[i] == removeNum){
     for(j = i; j < arrayLen; j++){
        array[j] = array[j+1];
      }
      arrayLen--;
   }
}
return arrayLen;
}
int-Remove(int*array、int-arrayLen、int-removeNum)
{
int i,j;
对于(i=0;i
其中,removeNum是用户在main()中选择的

我看到两个问题:

  • 你的阅读超过了列表的末尾,因为你的内部循环太过了。(在
    j=arrayLen-1
    j+1=arrayLen
    ,它超过了数组的末尾。)
  • 您说您只想删除第一个找到的元素,但您的代码继续超过该点。添加早期的
    返回
    (或
    中断
    )可以修复该问题
  • 以下是您的代码的固定版本:

    int remove(int* array, int arrayLen, int removeNum)
    {
        int i, j;
    
        for (i = 0; i < arrayLen; i++)
        {
            if (array[i] == removeNum) {
                // Stop j at arrayLen - 1, which is the new end of the array
                for(j = i; j < arrayLen - 1; j++) {
                    array[j] = array[j + 1];
                }
    
                // Return the new size
                return arrayLen - 1;
            }
        }
    
        // If we didn't remove anything, return the original size
        return arrayLen;
    }
    
    int-remove(int*array、int-arrayLen、int-removeNum)
    {
    int i,j;
    对于(i=0;i
    在找到第一个匹配项后,必须从外部循环中断。如果数组中元素的顺序无关紧要,可以通过将最后一个元素移动到要删除的元素上,然后说大小较短来加快“删除”过程。这涉及到更少的数据移动,但如果(很可能)顺序很重要,则可能不合适。“删除…重复项”误导。函数在查找目标元素(如果有)时“收缩”数组。函数本身没有删除“复制”属性。还有一个好问题。不得不说,当编译与标准库冲突的代码时,您没有收到标识符警告/错误,这有点奇怪,除非使用此功能的模块从未包含
    stdio.h
    ,当然。添加返回值解决了仅删除第一个实例的问题,但是出于某种原因,将jint main()测试代码,您正在使用该代码构建作为问题一部分传递到函数中的数组。是的,我猜
    arrayLen
    是错的?如果看不到阵列的实际分配/构造,就无法知道。