如何创建通用函数来替换数组中的元素?
How to create a generic function to replace elements in an array?
我试图在 c 中创建一个泛型函数来用另一个元素替换数组中出现的所有元素,但我在实现用于替换字符串的泛型函数时遇到了困难。它只在本地有效,不影响初始数组。
我试过将 arr_el 参数设为双指针,但它一直抛出段错误。
我应该如何更改 replaceString 函数才能使其正常工作?
void replaceString(void *arr_el, void* val) {
char* arr_el_adr = *(char**)((arr_el));
char *copy_val = malloc(strlen((char*)val) + 1);
strcpy(copy_val, (char*)val);
arr_el = ©_val;
printf("%s %s\n", *(char**)arr_el, arr_el_adr);
}
int equalString(void* a, void* b) {
char* str1 = (char*)a;
char* str2 = *(char **)b;
return strcmp(str1, str2);
}
void replaceAll(void* el, void* replace_val, void *arr, int size, int dim, int(*equal)(void*, void*), void(*replace)(void*, void*)) {
char *handler = arr;
int i;
for (i = 0; i < size; i++) {
if (equal(el, arr + i*dim) == 0) {
char *temp_handler = arr + i*dim;
replace(temp_handler, replace_val);
}
}
}
int main() {
char* arr[] = { "ana", "maria", "ana", "nothing" };
int N = sizeof(arr) / sizeof(arr[0]);
char x[] = "ana";
char y[] = "gabriel";
int i;
replaceAll(x, y, arr, N, sizeof(char*), equalString, replaceString);
for (i = 0; i < N; i++)
printf("%s ", arr[i]);
return 0;
}
在此测试中,它应将位置 0 和 2 上的 "ana" 替换为 "gabriel"。
It only works locally and doesn't affect the initial array.
arr_el = ©_val;
必须
*((char**)arr_el) = copy_val;
其实你功能再复杂也是白搭,可以
void replaceString(void *arr_el, void* val) {
*((char**)arr_el) = strdup(val);
}
除此之外,您为什么要使用所有 void*
而不是正确的类型?你说你想要泛型代码,但编译器会抱怨,因为你在 arr + i*dim
中使用 void *
进行指针运算,这可能会给出错误的结果
我试图在 c 中创建一个泛型函数来用另一个元素替换数组中出现的所有元素,但我在实现用于替换字符串的泛型函数时遇到了困难。它只在本地有效,不影响初始数组。
我试过将 arr_el 参数设为双指针,但它一直抛出段错误。
我应该如何更改 replaceString 函数才能使其正常工作?
void replaceString(void *arr_el, void* val) {
char* arr_el_adr = *(char**)((arr_el));
char *copy_val = malloc(strlen((char*)val) + 1);
strcpy(copy_val, (char*)val);
arr_el = ©_val;
printf("%s %s\n", *(char**)arr_el, arr_el_adr);
}
int equalString(void* a, void* b) {
char* str1 = (char*)a;
char* str2 = *(char **)b;
return strcmp(str1, str2);
}
void replaceAll(void* el, void* replace_val, void *arr, int size, int dim, int(*equal)(void*, void*), void(*replace)(void*, void*)) {
char *handler = arr;
int i;
for (i = 0; i < size; i++) {
if (equal(el, arr + i*dim) == 0) {
char *temp_handler = arr + i*dim;
replace(temp_handler, replace_val);
}
}
}
int main() {
char* arr[] = { "ana", "maria", "ana", "nothing" };
int N = sizeof(arr) / sizeof(arr[0]);
char x[] = "ana";
char y[] = "gabriel";
int i;
replaceAll(x, y, arr, N, sizeof(char*), equalString, replaceString);
for (i = 0; i < N; i++)
printf("%s ", arr[i]);
return 0;
}
在此测试中,它应将位置 0 和 2 上的 "ana" 替换为 "gabriel"。
It only works locally and doesn't affect the initial array.
arr_el = ©_val;
必须
*((char**)arr_el) = copy_val;
其实你功能再复杂也是白搭,可以
void replaceString(void *arr_el, void* val) {
*((char**)arr_el) = strdup(val);
}
除此之外,您为什么要使用所有 void*
而不是正确的类型?你说你想要泛型代码,但编译器会抱怨,因为你在 arr + i*dim
中使用 void *
进行指针运算,这可能会给出错误的结果