我已编写此功能,以便从count
处arr
删除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
?
答案 0 :(得分:0)
global_struct.array
是指向char
的指针,看起来像是指向一个字符串。因此,您需要将函数签名更改为:
void remove_strings(char *str[], size_t idx, size_t count);
我建议将idx
,count
,i
和j
更改为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];
}