2

CI では、次のような関数が必要です。

bool RemoveFirstIndex(char* inArray[])

入って、その配列の最初の要素を取り出します。

例えば

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

どうすればいいのかわからない。

inSize - 1 の新しい配列を作成し、インデックス 0 以外のすべてを入力する必要があると思います。しかし、その場合、関数は新しい char*[] を返す必要がありますか? ちょっと無駄じゃないですか?

ありがとうございました。

4

3 に答える 3

11

最初の要素を削除したり、新しい配列を作成したりするのはなぜですか?

ポインターをインクリメントして、配列内の次の項目を指すようにするだけです。

char **newArray = inArray + 1;

newArrayある限り有効ですinArray

于 2012-06-27T18:41:32.953 に答える
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;
}
于 2012-06-27T18:34:36.587 に答える
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';
于 2012-06-27T19:02:50.973 に答える