C:从完整数组中删除并仅删除第一个重复实例

时间:2016-09-18 18:35:26

标签: c arrays

我有一个数组,我试图从中删除值,但是当我尝试从数组中删除时遇到2个问题:

1。)当我尝试从已满的数组中删除时,我收到 * Stack Smashing Detected * 错误

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

其中removeNum是在main()中选择的用户。

1 个答案:

答案 0 :(得分:2)

我看到两个问题:

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

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