Как создать универсальную функцию для замены элементов в массиве? - PullRequest
0 голосов
/ 03 февраля 2019

Я пытаюсь создать универсальную функцию в 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 = &copy_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;
}

В этом тесте следует заменить «ana» на «gabriel» в позициях 0 и 2.

1 Ответ

0 голосов
/ 03 февраля 2019

Он работает только локально и не влияет на исходный массив.

arr_el = &copy_val;

должен быть

*((char**)arr_el) = copy_val;

, и фактически ваша функция сложна дляничего, может быть

void replaceString(void *arr_el, void* val) {
    *((char**)arr_el) = strdup(val);
}

Из-за этого, почему вы используете все это void*, а не правильный тип?Вы говорите, что хотите универсальный код, но компилятор жалуется, потому что вы делаете арифметику указателей с void * в arr + i*dim, который может дать неправильный результат

...