首页 > 解决方案 > 从数组中删除元素的函数不起作用

问题描述

我想写一个函数,它在被调用时从数组中删除一个元素,因为deleteArray函数中传递的参数是数组、它的长度和要删除的元素的值。

for如果找到元素,则尝试在遍历数组时跳出循环,然后尝试使用i循环,然后尝试在另一个循环中使用 ' 值for将当前元素替换为下一个元素。

喜欢array[j] = array[j + 1]

这是代码:

#include <iostream>

using namespace std;

void deleteElement(int[], int, int);

int main() {

    int array1[] = { 1, 4, 3, 5, 6 };

    int length = sizeof(array1) / sizeof(array1[0]); //For length of array

    deleteElement(array1, length, 4);

    cout << "\nIn main function\n";

    for (int i = 0; i < length; i++) {
        cout << array1[i];
    }
    return 0;
}

void deleteElement(int array2[], int length, int element) {

    int i = 0;

    for (int i; i < length; i++) {
        if (array2[i] == element) {
            for (int j = i; j < length; j++) {
                array2[j] = array2[j + 1];
            }
            break;
        }
    }

    if (i == (length - 1)) {
        cout << ("Element doesn't exist\n");
    }

    cout << "Testing OP in deleteElement\n";

    for (int i = 0; i < length; i++) {
        cout << array2[i];
    }
}

预期的:

Testing OP in deleteElement
14356
In main function
1356

实际的:

Testing OP in deleteElement
14356
In main function
14356

标签: c++

解决方案


这个问题相当愚蠢:

在 的开头deleteElement(),您使用 定义i,但在每个循环中将int i = 0;另一个变量重新定义i为本地索引。循环引入了一个新的作用域,因此for循环的第一个子句中的定义定义了一个 new ,它隐藏了在外部作用域中定义的同名变量。forint ifori

for (int i; i < length; i++) {

而且您没有初始化这个 i变量。

有2个后果:

  • 第一个循环中未定义的行为i未初始化。比较i < length可能会立即失败。
  • 测试if (i == (length - 1)) {测试外部i变量,而不是for迭代的变量。此外,该测试应if (i == length) {

还有其他问题:

  • 嵌套for循环迭代一次太多次:当j == length - 1,访问array[j + 1]具有未定义的行为。

  • 你不更新length,所以数组的最后一个元素是重复的。您必须通过length引用传递,以便它在调用者的范围内更新。

这是一个更正的版本:

#include <iostream>

using namespace std;

void deleteElement(int array2[], int& length, int element);

int main() {

    int array1[] = { 1, 4, 3, 5, 6 };

    int length = sizeof(array1) / sizeof(array1[0]); //For length of array

    deleteElement(array1, &length, 4);

    cout << "\nIn main function\n";
    for (int i = 0; i < length; i++) {
        cout << array1[i] << " ";
    }
    return 0;
}

void deleteElement(int array2[], int& length, int element) {

    int i;

    for (i = 0; i < length; i++) {
        if (array2[i] == element)
            break;
    }

    if (i == length) {
        cout << "Element doesn't exist\n";
    } else {
        length -= 1;
        for (; i < length; i++) {
            array2[i] = array2[i + 1];
        }
    }

    cout << "Testing OP in deleteElement\n";
    for (i = 0; i < length; i++) {
        cout << array2[i] << " ";
    }
}

推荐阅读