【问题标题】:Deleting occurrences of an element in an array in C在C中删除数组中元素的出现
【发布时间】:2022-08-16 22:06:53
【问题描述】:

此 C 代码用于删除数组中所有出现的整数。但是,当我执行它时,显示最终数组时出现问题,一旦找到第一次出现,代码就不会显示数组的其余部分。

unsigned int T[10], n, i, j, exist, integerDeleteOccurences;

printf(\"Array length : \");
scanf(\"%u\", &n);

for(i=0; i<n; i++)
{
    printf(\"%u | \", T[i]);
}

printf(\"The number you want to delete its occurences : \");
scanf(\"%u\", &integerDeleteOccurences);

exist = 0;

for (i=0; i<n; i++)
{
    if (T[i] == integerDeleteOccurences)
    {
        j = i;
        for (j=i; j<n-1; j++);
        {
            T[j] = T[j+1];
        }
        exist = 1;
        i--;
        n--;
    }
}

if (exist == 1)
{
    for (i=0; i<n; i++)
    {
        printf(\"%u | \", T[i]);
    }
}

else if (exist == 0)
{
    printf(\"This number doesn\'t exist in the array ! \\n\");
}
  • 您没有提供完整的代码,并且您从未显示的流中获取输入。在被省略的细节中存在很多未定义行为的可能性,因此几乎不可能提供一个合理的答案。减少您的代码,使其完整并显示使用的实际数据。
  • 在您显示的代码中,T 未初始化,因此当您尝试将T[0] 传递给 printf 时,您有未定义的行为,无论是否尝试在条件下使用 n 的潜在未设置值for 循环被定义为行为。
  • n需要小于10,为什么不考虑动态分配数组呢?
  • 顺便说一句,for 循环中的无符号变量ij 通常是有风险的。

标签: c debugging


【解决方案1】:

工作时静态分配的数组(即你知道最大可能尺寸),您应该通过跟踪它们的当前大小来处理它们。下面是一些代码,说明如何在给定数组及其大小的情况下删除元素的所有出现:

#include <stdio.h>

#define MAX_SIZE 10

int deleteAllOccurrencies(int* arr, int size, int el)
{
    int occurrencies = 0;

    for (int i = 0; i < size; i++)
    {
        if (arr[i] == el)
        {
            occurrencies++;
            
            // shift following elements
            for (int j = i; j < size; j++)
            {
                arr[j] = arr[j + 1];
            }
        }
    }

    return occurrencies;
}

void printArray(int arr[], int size)
{
    printf("[ ");
    for (int i = 0; i < size; i++)
    {
        printf("%d", arr[i]);
        if (i < size - 1)
            printf(", ");
    }
    printf("]\n");
}

int main(int argc, char** argv)
{
    int array[MAX_SIZE] = { 1, 2, 3, 4, 2, 6, 7, 8, 2, 10 };
    int size = MAX_SIZE;

    printf("Array before: ");
    printArray(array, size);
    
    size = deleteAllOccurrencies(array, size, 2);
    
    printf("Array after: ");
    printArray(array, MAX_SIZE - size);
    printf("Result: %d occurrencies found\n", size);

    return 0;
}

【讨论】:

    【解决方案2】:

    这远非复杂。

    size_t removeFromArray(int *arr, size_t size, int val)
    {
        int *tail = arr;
        size_t newSize = size;
        if(arr && size)
        {
            while(size--)
            {
                if(*tail == val) { tail++; newSize--;}
                else 
                    *arr++ = *tail++;
            }
        }
        return newSize;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-04
      相关资源
      最近更新 更多