删除一个Array元素

时间:2016-01-14 09:49:35

标签: objective-c arrays string sizeof

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

#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];

    }

}

3 个答案:

答案 0 :(得分:3)

您的代码存在许多问题,让我们一个一个地看到它们。

  1. 将数组传递给函数时,它会衰减到指向数组第一个元素的指针。因此,sizeof函数中的deleteArray()没有按照您认为的那样做。

    您可以使用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);
    

答案 1 :(得分:0)

如果您需要动态调整大小的数组,我建议将它们作为某些(可增长的)struct的最后flexible array member(wikipage有一个示例),并将该数组的大小保持在其包含的struct中。 1}} ....

答案 2 :(得分:0)

如果您想拥有数组功能,例如添加,删除,移动等,请使用链接列表。链接列表使用指针,因此您可以使用它们表示数组。这样就可以删除元素,移动元素或添加新元素。

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