ошибка сегментации qsort - PullRequest
       28

ошибка сегментации qsort

2 голосов
/ 11 февраля 2012

Итак, я работаю над программой, в которой функция читает из stdio и продолжает читать в символах кусками n символов.

До сих пор я понял, что все хранится в массиве символов, называемом буфером. Для следующего шага мне нужно отсортировать каждый кусок из n символов. Например, строка cats / ndogs / n должна быть разделена на кошки / n собак / n, если n = 5, а затем qsort() необходимо алфавитировать ее. Вот как я звоню qsort():

qsort (buffer, (line-2)*n*(sizeof(char)),n,compare);

Где (line-2)*n*sizeof(char) - общее количество элементов в буфере массива; 10 в этом случае.

Это моя функция сравнения:

int compare (const void * a, const void * b)
{
   return (strcmp(*(char **)a, *(char **)b));
}

Однако, когда я запускаю это, я всегда получаю ошибку сегмента в strcmp(). Есть идеи почему?


Это код загрузки:

while (!feof(stdin))
{
    for (i = 0; i < n; i++)
    {
        char l = getchar();
        if (l != EOF)
        {
            if ((i == 0) && (line != 1))
            {
                success = (int *)realloc(buffer, line*n*(sizeof(char)));
            }
            buffer[(n*(line-1))+i] = l;
        }
     }
     line = line + 1;
}

Ответы [ 2 ]

1 голос
/ 11 февраля 2012

Глупый вопрос, а твои строки обнуляются? Похоже, что в конце только перевод строки.

Кроме того, вам, вероятно, нужен только "strcmp ((char *) a, (char *) b)", так как дополнительные * кажутся мне избыточными.

0 голосов
/ 11 февраля 2012
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char buffer[] ="333000222555111777888666999444";

int mycmp(void *l, void*r);
int main(void)
{
/* note: sizeof buffer is 31,
** but the integer division will round down
** , ignoring the extra nul-byte */
qsort(buffer, (sizeof buffer/3), 3, mycmp);
printf ("[%s]\n", buffer);

return 0;
}

int mycmp(void *l, void *r)
{
return memcmp(l,r,3);
}
...