Структура строк Qsort

пожалуйста, не могли бы вы мне помочь с qsort структуры строк? Мне нужно отсортировать слова в словаре по алфавиту. Проблема в том, что это вызывает у меня ошибку сегментации ... Вот мои структуры:

typedef struct {
    int length;
    char *data;
} Word;

typedef struct {
    int length;
    int index;
    Word *data;
} Dictionary;

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

int compare(const void *a, const void *b) 
{ 
    return strcmp (((Word *)a)->data, ((Word *)b)->data);
} 

А вот и реализация qsort:

qsort(&dictionary, dictionary.index, sizeof (Word *), compare); 

Спасибо большое за помощь.


person Jan Kožušník    schedule 14.12.2014    source источник
comment
Объясните использование length и index в Dictionary.   -  person chux - Reinstate Monica    schedule 14.12.2014
comment
длина - максимальная длина словаря, а индекс - фактическая длина   -  person Jan Kožušník    schedule 14.12.2014
comment
этот параметр qsort: sizeof (Word *) неверен, вам не нужен размер указателя, вам нужен размер структуры слова. I.E. sizeof (Word). Кажется, что-то не так с первой парой параметров qsort, но я не уверен, в чем проблема.   -  person user3629249    schedule 15.12.2014


Ответы (2)


Вы пытаетесь qsort использовать структуру своего словаря, а не данные словарей.

qsort(dictionary.data, dictionary.index, sizeof (Word *), compare); 

Вы также должны дважды проверить, чтобы убедиться, что dictionary.index - это длина словаря, а не dictionary.length

person GWW    schedule 14.12.2014
comment
и вам нужна лучшая compare функция. - person Iharob Al Asimi; 14.12.2014
comment
После добавления dictionary.data он по-прежнему вызывает ошибку сегментации. Как улучшить мою функцию сравнения? Спасибо - person Jan Kožušník; 14.12.2014
comment
Вы пробовали запустить его в отладчике, чтобы узнать, что вызывает ошибку сегментации? Также было бы неплохо, если бы вы могли отредактировать свой вопрос и включить минимальный компилируемый пример. - person GWW; 14.12.2014
comment
Я новичок в C, и я еще не использую отладчик. Не могли бы вы подробнее рассказать о компилируемом примере? - person Jan Kožušník; 14.12.2014
comment
Существует ряд хороших шпаргалок и руководств (например, Шпаргалка по командам gdb < / b>). Если вы собираетесь программировать на C, важно подружиться с gdb. Продолжайте, заплатите цену за вход и потратьте несколько часов на изучение gdb. Это сэкономит вам тысячи часов в долгосрочной перспективе ... - person David C. Rankin; 14.12.2014
comment
@ DavidC.Rankin: Лучший совет, который я хотел бы получить, когда мне пришлось изучать C в университете. Я не хотел изучать GDB в течение первых нескольких недель, и когда я наконец заставил себя выучить его, я избавил себя от нескольких часов головной боли. - person GWW; 14.12.2014
comment
Спасибо за ваши типы. Не могли бы вы мне помочь, как это решить? Длина словаря - максимальная длина словаря, индекс - фактический размер - person Jan Kožušník; 14.12.2014
comment
Почему вы пытаетесь писать вещи более сложные, чем Hello World, без отладчика или навыков отладки? Если бы каждый новичок сделал это, SO был бы завален сообщениями с просьбами об услугах отладки ... Ой, подождите! - person Martin James; 15.12.2014
comment
@ JanKožušník: Возможно, ваши строки не имеют нулевого конца? Как я уже сказал, это очень сложно без минимального примера, который я действительно могу скомпилировать и запустить. - person GWW; 15.12.2014

Вам следует отсортировать список слов в словаре, а не в словаре. Если длина - это количество всех элементов в вашем списке слов, вы должны использовать:

qsort(dictionary.data, dictionary.length, sizeof (dictionary.data[0]), compare);

и вы правы, ваша функция сравнения неверна, например.

int compare(const void *a, const void *b) 
{ 
  const Word *x = a, *y =b;
  return strcmp (x->data,y->data); /* if data always contains a C string */
} 
person user411313    schedule 14.12.2014
comment
Спасибо за ваш ответ. Но как бы я его ни редактировал, он все равно вызывает ошибку сегментации. - person Jan Kožušník; 15.12.2014
comment
Простите, вы были правы. Вы просто, наверное, запутались в индексе и длине. После того, как я перепишу длину в индекс, все заработает. Спасибо! - person Jan Kožušník; 15.12.2014