Не работает программа сортировки строк с помощью двумерного массива указателей - C (СИ)
Формулировка задачи:
Не работает программа сортировки строк с помощью двумерного массива указателей. Не подскажете где ошибка?
#include <stdio.h> #include <stdlib.h> #include <string.h> #define strlength 1000 int main() { char **a; int i, j; int N; char s[strlength]; scanf("%d", &N); a = (char **)malloc((N + 1) * sizeof(char *)); for (i = 1; i <= N + 1; i++) { fgets(s, strlength, stdin); a[i] = (char *)malloc((strlen(s) + 1) * sizeof(char)); strcpy(a[i], s); } for (i = 1; i <= N + 1; ++i) { strcpy(s, a[i]); j = i - 1; while ((j >= 0) && (strcmp(a[j], s) > 0)) { strcpy(a[j + 1], a[j]); j = j - 1; } strcpy(a[j + 1], s); } for (i = 1; i <= N + 1; i++) fputs(a[i], stdout); for(i = 1; i < N; i++) { free(a[i]); } free(a); return 0; }
Немного исправил, теперь выдает на некоторых наборах debug ошибку.
#include <stdio.h> #include <stdlib.h> #include <string.h> #define strlength 1000 int main() { char **a; int i, j; int N; char s[strlength]; scanf("%d", &N); a = (char **)malloc((N + 1) * sizeof(char *)); for (i = 0; i < N + 1 ; i++) { fgets(s, strlength, stdin); a[i] = (char *)malloc((strlen(s) + 1) * sizeof(char)); strcpy(a[i], s); } for (i = 1; i < N + 1; ++i) { strcpy(s, a[i]); j = i - 1; while ((j >= 0) && (strcmp(a[j], s) > 0)) { strcpy(a[j + 1], a[j]); j = j - 1; } strcpy(a[j + 1], s); } for (i = 0; i < N +1; i++) fputs(a[i], stdout); for(i = 0; i < N; i++) { free(a[i]); } free(a); return 0; }
Решение задачи: «Не работает программа сортировки строк с помощью двумерного массива указателей»
textual
Листинг программы
......................... char* tmp; .................. for (i = 1; i < N + 1; ++i) { tmp=a[i]; j = i - 1; while ((j >= 0) && (strcmp(a[j], tmp) > 0)) { a[j + 1]=a[j]); j = j - 1; } a[j + 1]=tmp; }
Объяснение кода листинга программы
В данном коде реализуется алгоритм сортировки пузырьком для массива строк, используя двумерный массив указателей. Ниже представлена последовательность действий:
- Переменная
tmp
инициализируется значениемa[i]
(пустая строка). - В каждой итерации цикла
for
начиная сi=1
доN+1
(включительно) выполняется следующее:- Значение
tmp
присваиваетсяa[i]
. - Переменная
j
инициализируется значениемi-1
(т.е.i
уменьшается на единицу). - В цикле
while
происходит сравнение и перестановка элементов массива:- Пока
j
больше или равно нулю и значениеa[j]
больше значенияtmp
, выполняется следующее:- Значение
a[j+1]
присваивается значениюa[j]
. - Значение
j
уменьшается на единицу.
- Значение
- После выхода из цикла
while
, значениеa[j+1]
присваивается значениюtmp
.
- Пока
- Значение
- Значение
tmp
не используется в цикле, поэтому предполагается, что оно не влияет на работу алгоритма. - Код не содержит обработки ошибок или проверки на выход за границы массива, что может привести к неопределенному поведению программы.
- Код не содержит вывода на экран, поэтому результаты сортировки не отображаются.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д