Сосредоточив внимание только на проблемах с сортировкой, основной является то, что вы никогда не вызываете функцию сортировки, которую вы определяете позже. Строка
void sortNames();
служит только для объявления функции с идентификатором sortNames
, которая принимает любое количество аргументов любых типов (вероятно, не совсем то, что вы хотите сделать). Я бы порекомендовал изменить эту строку на
sortNames(names, list); // Not &list because I'm about to suggest not taking it as a pointer
Тогда для самой функции sortNames
мне не совсем понятно, почему вы берете длину массива для сортировки в качестве указателя вместо просто передавая int
сам. Я бы порекомендовал изменить эту функцию на
void sortNames(char **name, int n) {
int i, j;
for (j = 0; j < n - 1; j++) {
for (i = 0; i < n - 1; i++) {
if (compareStr(name[i], name[i + 1]) > 0) {
char *t = name[i];
name[i] = name[i + 1];
name[i + 1] = t;
}
}
}
}
Одна проблема с этим в том виде, в каком она есть, заключается в том, что выражение compareStr(name[i], name[i + 1]) > 0
всегда ложно. Это связано с тем, что compareStr
возвращает только 0 или -1. Вы можете исправить это, переписав compareStr
, чтобы правильно обработать случай, когда *str1 > *str2
. Один из возможных способов сделать это может быть
int compareStr(char *str1, char *str2) {
if (*str1 == '\0' && *str2 == '\0') {
return 0;
} else if (*str1 > *str2) {
return 1;
} else if (*str1 < *str2) {
return -1;
}
return compareStr(str1 + 1, str2 + 1);
}
Хотя, если вы пишете это для изучения, я бы предложил попробовать пересмотреть ваше текущее итеративное решение, а не просто копировать и вставлять эту версию.
Наконец, поскольку вы хотите использовать эти функции до того, как определили их, вы должны либо переместить их определения до того момента, когда они используются (т. Е. Иметь compareStr
, затем sortNames
и затем main
), либо предоставить предварительное объявление в начале вашего файла для этих функций, т.е. добавьте
void sortNames(char **name, int n);
int compareStr(char *str1, char *str2);
над main
.
Как уже отмечали другие, вы, вероятно, хотите избежать fflush(stdin)
как его неопределенное поведение, и я бы рекомендовал против приведение к результату malloc
.