2012-02-11 5 views
2

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

До сих пор я получил это, чтобы все хранилось в массиве символов, называемом буфером. Для следующего шага мне нужно отсортировать каждый фрагмент из n символов. Например, строка cats/ndogs/n должна быть разделена как cats/n dogs/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; 
} 
+0

Этот код загрузки (который должен * действительно быть в вопросе) выглядит сильно сломанным; вам нужно * использовать * возвращаемое значение 'realloc()': это ваш новый 'buffer'! – unwind

+0

Ваш 'char l = getchar();' является незначительной катастрофой; 'getchar()' возвращает 'int', а не' char'. Если символы без знака, тест EOF никогда не будет правдой. Если символы подписаны, вы получите фиктивный EOF при чтении символьного кода 0xFF (часто U + 00FF, ÿ, LATIN SMALL LETTER Y WITH DIAERESIS или y-umlaut, в частности, на турецком языке). Это _good_, что вы сохраняете возвращаемое значение из 'realloc()' в новой переменной. Это ** плохо **, что вы не проверяете отказ в распределении памяти, и это ** плохо **, что вы не используете новое значение вместо старого. Использование 'realloc()' может перемещать вашу память. –

+1

1) что такое строка 2) ваше использование feof() нецелесообразно 3) casting malloc() et.al is unwanted 4) realloc() указатель на указатель int - это волшебство! 5) что происходит? 6) sizeof (char) равен 1, по определению. 7) что такое буфер? 8) что сказал Джонатан о персонаже и EOF. – wildplasser

ответ

1

Глупый вопрос, но ваши строки нуля? Кажется, у вас есть только новая линия.

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

+0

они arent null terminiated, мне нужно добавить нулевой терминатор в конце каждого символа n, чтобы работать с strcmp? поэтому в этом примере мне пришлось бы сделать мой буфер длиной 12 символов – user1161080

+0

Я не знаю, почему вы усложняете функцию strcmp ??Это должно быть просто strcmp ((char *) a, (char *) b) – noMAD

+0

Ну, либо нуль завершает их (поэтому для «ABCDE» вам нужно место для 6 символов), потому что strcmp будет искать первый нуль в двух строках (отсюда ошибка памяти, если она отсутствует) ИЛИ, возможно, использовать strncmp, но вам понадобится глобальная переменная, чтобы указать максимальную длину строк. –

0
#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); 
} 
+0

Я изменил memcmp, который будет называться вот так, используя размер как третий параметр, и я больше не получаю ошибку сегментации , Но в то же время функция doesnt ничего не делает, содержимое моего массива arent становится отсортированным .. – user1161080

+0

Код, который я опубликовал, предназначен только для демонстрации. Хотя ваш код неполный, в нем есть несколько ошибок. Попробуйте разделить часть чтения и часть сортировки, а также создать и отладить их отдельно. – wildplasser