【问题标题】:Remove first index in a char*[]删除 char*[] 中的第一个索引
【发布时间】:2012-06-27 18:29:16
【问题描述】:

在 C 中我想要这样的函数:

bool RemoveFirstIndex(char* inArray[])

它进入并取出该数组中的第一个元素。

例如

inArray = "Hello\o", "How\o", "Are\o"
RemoveFirstIndex(inArray)
inArray = "How\o", "Are\o"

不知道该怎么做。

我知道我必须创建一个新的 inSize - 1 数组,然后用除索引 0 之外的所有内容填充它。 但如果我这样做,该函数是否需要返回一个新的 char*[]?是不是有点浪费?

谢谢。

【问题讨论】:

  • 反正他问的是C,所以我给了他一个C的答案。
  • 无法将char* inArray[3] 转换为char* inArray[2],它们不兼容。这就是您的示例表明您正在尝试做的事情。
  • 在 C 中,数组不能调整大小;您不能将 3 元素数组转换为 2 元素数组,反之亦然。如果您真的需要一个可调整大小的数据容器,请考虑实现一个列表结构(或切换到 C++ 并使用像 vector 这样的 STL 容器)。

标签: c++ c arrays char


【解决方案1】:

为什么要删除第一个元素或创建一个新数组?

只需增加您的指针,使其指向数组中的下一项。

char **newArray = inArray + 1;

newArrayinArray 一样有效。

【讨论】:

  • +1。也打不过我吧。这种方法的唯一问题是确保只释放第一个数组,而不是 newArray。
  • @0x69:你看代码了吗?他没有修改数组,他正在创建一个新指针,该指针指向该数组开头之后的一个元素。这是完全有效的。
  • Char* 总是让我感到困惑,尤其是 char**。或 char*[]。或字符[][]。这对于解决方案非常有意义,非常感谢!
【解决方案2】:

使用动态内存管理并缩小该数组:

// 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;
}

【讨论】:

    【解决方案3】:
    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';
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-08
      • 2011-03-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-22
      • 2020-05-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多