【发布时间】:2019-02-03 17:25:04
【问题描述】:
我正在尝试在 c 中创建一个通用函数来用另一个元素替换数组中一个元素的所有出现,但我一直坚持实现替换字符串的通用函数。它只在本地有效,不影响初始数组。
我尝试将 arr_el 参数设置为双指针,但它一直抛出 seg 错误。
我应该如何更改 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”。
【问题讨论】:
-
你有工作的非通用代码来完成你需要的工作吗? C 中的通用代码通常需要您计划使用的对象的大小——例如,参见标准 C 中的
qsort()。 -
我没有费心去实现一个非泛型代码。我想将指针更改为数组中的字符串就可以了。我已经让它在整数数组上工作了。顺便说一句,这是大学作业。
-
如果没有一两个非泛型实现可供使用,我不会尝试它。从长远来看,这样做比直接使用通用版本更快。我已经用 C 编码足够长的时间了,我可能在过去实现了类似的东西并且可以利用它,但它仍然使用先前的非泛型实现知识来到达正确的地方。此外,请确保您在至少两种截然不同的数据类型(例如
double和struct SomeThing)上测试通用代码。
标签: c pointers function-pointers generic-programming