我已经编写了此函数以count
从arr
index处删除成员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
?
global_struct.array
是指向的指针char
,并且看起来像是要指向一个字符串。因此,您需要将函数签名更改为以下内容:
void remove_strings(char *str[], size_t idx, size_t count);
我建议改变idx
,count
,i
,和j
向型size_t
,因为这是一个unsigned
保证持有任何数组索引整数类型。该size_t
类型自C99开始可用。
这是一个包含该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
与终止小号'\0'
。但是,将int
s数组终止为零通常不是一个好主意。您的代码的这一功能确实使将其修改为与字符串一起使用变得很简单。
尽管您的函数可能满足您当前的要求,但请考虑对其进行更改以返回int
存储在数组中的s数。跟踪int
存储在数组中的s的数目是有意义的,并将此值作为参数传递允许函数在没有哨兵值的情况下遍历数组。这是您的功能的修订版:
size_t remove_ints(size_t idx, size_t count, int arr[], size_t arr_sz)
{
size_t i, j;
for (i = 0; i < count; i++)
for (j = idx; j < arr_sz; j++)
arr[j] = arr[j+1];
return arr_sz - count;
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句