Вывести (значение) значение void * и повторить его - PullRequest
0 голосов
/ 22 сентября 2019

Это продолжение моего последнего вопроса о печати указателя void*, Печать значений типа void *.Сейчас я пытаюсь напечатать символы в этой строке.Я могу напечатать первый символ, но у меня проблемы с итерацией по указателю для печати всех символов.Как это должно быть сделано?На данный момент у меня есть следующее:

int cmp (const void* x, const void* y) {

    char x_lower, y_lower;
    printf("x: %s | y: %s\n", *(char**) x, *(char**) y);

    for (int i=0; i<strlen(*(char**)x); i++) {
        printf("x: %c | y: %c\n",**(char **)(x+i),**(char **)(y+i));
    }

    return 0;
}

int main(int argc, char *argv[]) {
    char * strings[] = {"xml", "json"};
    qsort(strings, (sizeof(strings)/sizeof(strings[0])), sizeof(strings[0]), cmp);
}

. Вышеуказанное вызывает ошибку сегмента.

1 Ответ

1 голос
/ 22 сентября 2019

Мое общее правило - преобразовать аргументы компаратора в локальные (указатели) переменные правильного типа, а затем использовать их в остальной части функции.Вы не можете индексировать void * переменные в стандартном C, независимо от того, что говорит GCC.Размер void, на который он указывает, не существует.

int cmp(const void *vp1, const void *vp2)
{
    const char *s1 = *(char **)vp1;
    const char *s2 = *(char **)vp2;

    // Following your code - but it isn't very meaningful
    printf("x: %c | y: %c\n", *s1, *s2);
    printf("x: %s | y: %s\n",  s1,  s2);

    size_t len = strlen(s1);
    for (size_t i = 0; i < len; i++)
        printf("x: %c | y: %c\n", s1[i], s2[i]);

    return 0;
}

Это гораздо легче понять (и написать), чем использовавшиеся вами искажения.Существует даже умеренный шанс, что это «сработает», хотя, поскольку все элементы сравниваются одинаково, данные не будут отсортированы каким-либо значимым образом (одна из причин комментария в коде).

Предупреждение: Перед публикацией этого ответа не было консультации с компилятором.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...