删除数组元素
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];
}
}
你的代码有很多问题,我们一一来看。
当您将数组传递给函数时,它会衰减为指向数组第一个元素的指针。所以,deleteArray()
函数中的 sizeof
并没有像你想象的那样做。
您可以使用 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);
如果您需要动态大小的数组,我建议将它们设为某些(可增长的)struct
的最后一个 flexible array member(该维基页面有一个示例),并将该数组的大小保持在其包含struct
....
如果你想有数组的特性,比如增删改查,用链表。链接列表使用指针,因此您可以使用它们表示数组。这样就可以删除元素、移动元素或添加新元素。
在 c 中声明数组时,您声明它是固定大小的。在您的情况下,如果您不想使用指针和列表,则必须将数组元素复制到一个新元素,不包括不需要的元素。
所以我试图编写一个函数来从 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];
}
}
你的代码有很多问题,我们一一来看。
当您将数组传递给函数时,它会衰减为指向数组第一个元素的指针。所以,
deleteArray()
函数中的sizeof
并没有像你想象的那样做。您可以使用
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);
如果您需要动态大小的数组,我建议将它们设为某些(可增长的)struct
的最后一个 flexible array member(该维基页面有一个示例),并将该数组的大小保持在其包含struct
....
如果你想有数组的特性,比如增删改查,用链表。链接列表使用指针,因此您可以使用它们表示数组。这样就可以删除元素、移动元素或添加新元素。
在 c 中声明数组时,您声明它是固定大小的。在您的情况下,如果您不想使用指针和列表,则必须将数组元素复制到一个新元素,不包括不需要的元素。