在C中我想要一个这样的函数:
bool RemoveFirstIndex(char* inArray[])
进入并取出该数组中的第一个元素。
e.g。
inArray = "Hello\o", "How\o", "Are\o"
RemoveFirstIndex(inArray)
inArray = "How\o", "Are\o"
不确定如何去做。
我认为我必须创建一个新的inSize - 1数组,并用除索引0之外的所有内容填充它。 但是,如果我这样做,该函数是否需要返回一个新的char * []?不是有点浪费吗?
谢谢。
答案 0 :(得分:10)
为什么要删除第一个元素或创建一个新数组?
只需增加指针,使其指向数组中的下一个项目。
char **newArray = inArray + 1;
只要newArray
是, inArray
就有效。
答案 1 :(得分:0)
使用动态内存管理并缩小该数组:
// create the array
size_t arrsize = 10;
char **arr = malloc(arrsize * sizeof(*arr));
int i;
for (i = 0; i < arrsize; i++)
arr[i] = malloc(/* whatever the length of the string (incl. NUL) is */);
// then use it like this:
RemoveFirstIndex(arr, &arrsize);
bool RemoveFirstIndex(char **inArray, size_t *arr_len)
{
if (*arr_len == 0 || inArray == NULL)
return false;
free(inArray[0]);
int i;
*arr_len--;
for (i = 0; i < *arr_len; i++)
inArray[i] = inArray[i + 1];
inArray = realloc(inArray, sizeof(*inArray) * (*arr_len));
return true;
}
答案 2 :(得分:0)
void RemoveFirstIndex(std::vector<std::string> &inArray) {
if (!inArray.empty())
inArray.erase(inArray.begin());
}
std::vector<std::string> array = {"Hello", "How", "Are"};
RemoveFirstIndex(inArray)
// array now contains {"How", "Are"}
你不应该使用一个char指针数组,但如果你这样做,你需要指出它的大小以及函数指示后面的新大小的方法。
size_t RemoveFirstIndex(char **inArray, size_t n) {
if (n==0)
return n;
std::rotate(inArray,inArray+1,inArray+n);
// raw pointers indicate we don't own these resources
// so we don't need to deallocate anything...
return n-1;
}
char *array[] = {"Hello", "How", "Are"};
size_t size = sizeof array/sizeof *array;
for (size_t i=0;i<size;++i)
std::cout << array[i] << '\n';
size = RemoveFirstIndex(array,size);
for (size_t i=0;i<size;++i)
std::cout << array[i] << '\n';