Не работает программа сортировки строк с помощью двумерного массива указателей - 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не используется в цикле, поэтому предполагается, что оно не влияет на работу алгоритма. - Код не содержит обработки ошибок или проверки на выход за границы массива, что может привести к неопределенному поведению программы.
- Код не содержит вывода на экран, поэтому результаты сортировки не отображаются.