从char数组中删除成员*

时间:2017-01-10 03:01:47

标签: c arrays char

我已编写此功能,以便从countarr删除idx成员。

void remove_int(int (*arr)[], int idx, int count)
{
    int i, j;

    for (i = 0; i < count; i++)
        for (j = idx; (*arr)[j]; j++)
            (*arr)[j] = (*arr)[j+1];
}

我称之为:

remove_int(&arr, index, cnt);

这适用于本地整数。这是我的问题。我有一个像这样的头文件:

struct {
    /* other stuff */
    char *array[100];
} global_struct;

array中的成员已分配并填充。

有人认为我可以将int切换为char,将int (*arr)[]切换为char *(*arr)[],然后致电:

remove_char(&global_struct.array, index, cnt);

我试过了,但实际上并没有修改global_struct.array。我应该如何更改remove_int以使用global_struct.array

2 个答案:

答案 0 :(得分:0)

global_struct.array是指向char的指针,看起来像是指向一个字符串。因此,您需要将函数签名更改为:

void remove_strings(char *str[], size_t idx, size_t count);

我建议将idxcountij更改为size_t,因为这是unsigned整数类型保证保存任何数组索引。自C99以来,size_t类型已可用。

这是一个演示程序,其中包含remove_int()函数的修改版本:

#include <stdio.h>

struct {
    char *array[100];
} global_struct;

void remove_strings(char *str[], size_t idx, size_t count);

int main(void)
{
    global_struct.array[0] = "One";
    global_struct.array[1] = "Two";
    global_struct.array[2] = "Three";
    global_struct.array[3] = "Four";
    global_struct.array[4] = "Five";
    global_struct.array[5] = NULL;

    for (size_t i = 0; global_struct.array[i]; i++) {
        printf("%s\n", global_struct.array[i]);
    }

    remove_strings(global_struct.array, 2, 2);

    putchar('\n');
    puts("After removal:");
    for (size_t i = 0; global_struct.array[i]; i++) {
        printf("%s\n", global_struct.array[i]);
    }    

    return 0;
}

void remove_strings(char *str[], size_t idx, size_t count)
{
    size_t i, j;

    for (i = 0; i < count; i++)
        for (j = idx; str[j]; j++)
            str[j] = str[j+1];
}

节目输出:

One
Two
Three
Four
Five

After removal:
One
Two
Five

此外,您的函数remove_int()似乎仅适用于排除int成员的0数组,因为0用作内部循环中的标记值你的功能。通常使用char指针终止指向NULL的指针数组,就像我所做的那样,当然字符串是char的数组,以{{1}结尾}}。但是,终止一个零'\0'的数组通常不是一个好主意。您的代码的这一功能确实使其适应字符串的使用变得简单。

虽然您的函数可能满足您当前的要求,但请考虑更改它以返回存储在数组中的int个数。跟踪存储在数组中的int的数量是有意义的,并且将此值作为参数传递允许函数在没有sentinel值的情况下迭代数组。以下是您的功能的修订版本:

int

答案 1 :(得分:-2)

“for(i = 0; i&lt; count; i ++)”的目的是什么? 据我所知,我认为你应该:

void remove_int(int (*arr)[], int idx)
{
   int j;
     for (j = idx; (*arr)[j]; j++)
         (*arr)[j] = (*arr)[j+1];
}