所以我试图编写一个函数来从一个数组中删除一个元素。由于某些原因,我没有得到任何错误,但仍然没有打印出我需要的结果。我认为问题出在函数或数据类型声明中。
#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];
}
}
答案 0 :(得分:3)
您的代码存在许多问题,让我们一个一个地看到它们。
将数组传递给函数时,它会衰减到指向数组第一个元素的指针。因此,sizeof
函数中的deleteArray()
没有按照您认为的那样做。
您可以使用strlen()
来获取char
数组的长度。但是,请注意,这不会计算终止空值,无论如何,您还需要移动那个,以便使修改后的数组结束。
然后,在for
循环中,
for (int i = 0; i >= NumberOfElements;i++) //false always....
错了。我相信你想要的是
for (int i = 0; i < NumberOfElements;i++)
之后,关于对函数的调用应该是
deleteArray(str, 'a'); // 'a' is a char
而不是
deleteArray(str, "a"); // "a" denotes a string
接下来,在main()
函数中,从参数&
中删除printf()
。它应该看起来像
printf("%s",str);
另外,为了确保缓冲区溢出的安全性,您应该使scanf()
看起来像
scanf("%99s",str);
答案 1 :(得分:0)
如果您需要动态调整大小的数组,我建议将它们作为某些(可增长的)struct
的最后flexible array member(wikipage有一个示例),并将该数组的大小保持在其包含的struct
中。 1}} ....
答案 2 :(得分:0)
如果您想拥有数组功能,例如添加,删除,移动等,请使用链接列表。链接列表使用指针,因此您可以使用它们表示数组。这样就可以删除元素,移动元素或添加新元素。
在c中声明数组时,将其声明为固定大小。在您的情况下,如果您不想使用指针和列表,则必须将数组元素复制到新元素,不包括不需要的元素。