删除数组元素

Remove an Array element

所以我试图编写一个函数来从 Array.for 中删除一个元素,但由于某些原因我没有收到任何错误,但仍然没有打印出我需要的结果。我认为问题出在函数或数据类型声明中。

#import <Foundation/Foundation.h>

void deleteArray(char stra[ ], char ElementToRemove);

int main(int argc, const char * argv[]) {
    @autoreleasepool {

        char str[100];
        printf("Please Enter Array Elements\n");
        scanf("%s",&str);

        deleteArray(str, "a");
        printf("%s",&str);

    }
    return 0;
}


void deleteArray(char stra[ ], char ElementToRemove)
{
    int NumberOfElements = sizeof(stra);
    int ElementPos;

    for (int i = 0; i >= NumberOfElements;i++)
    {
        if (ElementToRemove == stra [i])
        {
            ElementPos = i;
        }
    }

    for (int SecondCounter = ElementPos; SecondCounter >= NumberOfElements;SecondCounter++ )
    {
        stra[SecondCounter] = stra[SecondCounter - 1];

    }

}

你的代码有很多问题,我们一一来看。

  1. 当您将数组传递给函数时,它会衰减为指向数组第一个元素的指针。所以,deleteArray() 函数中的 sizeof 并没有像你想象的那样做。

    您可以使用 strlen() 来获取 char 数组的长度。但是,请注意,无论如何,这不包括终止空值,并且您还需要移动那个,以使修改后的数组结束。

  2. 然后,在for循环中,

     for (int i = 0; i >= NumberOfElements;i++)  //false always....
    

    错了。我相信你想要的是

     for (int i = 0; i < NumberOfElements;i++)
    
  3. 之后,关于函数的调用应该是

     deleteArray(str, 'a');  // 'a' is a char
    

    而不是

     deleteArray(str, "a"); // "a" denotes a string
    
  4. 接下来,在 main() 函数中,从 printf() 的参数中删除 &。它应该看起来像

    printf("%s",str);
    
  5. 另外,为了确保缓冲区溢出的安全,你应该让你的scanf()看起来像

    scanf("%99s",str);
    

如果您需要动态大小的数组,我建议将它们设为某些(可增长的)struct 的最后一个 flexible array member(该维基页面有一个示例),并将该数组的大小保持在其包含struct ....

如果你想有数组的特性,比如增删改查,用链表。链接列表使用指针,因此您可以使用它们表示数组。这样就可以删除元素、移动元素或添加新元素。

在 c 中声明数组时,您声明它是固定大小的。在您的情况下,如果您不想使用指针和列表,则必须将数组元素复制到一个新元素,不包括不需要的元素。