Сортировка строк (ошибка сегментации) - C (СИ)
Формулировка задачи:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void string_sort(char **a, int lim, int char_lim);
int main(void)
{
int i, LIM, CHAR_LIM;
scanf("%d%d", &LIM, &CHAR_LIM);
char **massive_of_strings = (char **)malloc(LIM * sizeof(char*));
for(i = 0; i < LIM; ++i)
{
massive_of_strings[i] = (char*)malloc(CHAR_LIM * sizeof(char));
}
for(i = 0; i < LIM; ++i)
{
printf("Введите %d-ую строку\n", i+1);
fgets(massive_of_strings[i], CHAR_LIM, stdin);
}
for(i = 0; i < LIM; ++i)
{
printf("Вы ввели %d-ую строку - %s\n", i+1, massive_of_strings[i]);
}
string_sort(massive_of_strings, LIM, CHAR_LIM);
printf("Строки после сортировки\n");
for(i = 0; i < LIM; ++i)
{
printf("%d-ая строка - %s\n", i+1, massive_of_strings[i]);
}
return 0;
}
void string_sort(char **a, int lim, int char_lim)
{
int i, j;
char * temp = (char*)malloc(char_lim * sizeof(char));
for(i = 0; i < lim; ++i)
{
for(j = lim; j >= i; --j)
{
if(strcmp(a[j],a[j-1]) < 0)
{
strcpy(temp, a[j]);
strcpy(a[j],a[j-1]);
strcpy(a[j-1], temp);
}
}
}
}Решение задачи: «Сортировка строк (ошибка сегментации)»
textual
Листинг программы
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void string_sort(char **a, int lim, int char_lim);
int main(void)
{
int i, LIM, CHAR_LIM;
scanf("%d%d", &LIM, &CHAR_LIM);
getchar();
char **massive_of_strings = (char **)malloc(LIM * sizeof(char*));
for(i = 0; i < LIM; ++i)
{
massive_of_strings[i] = (char*)malloc(CHAR_LIM * sizeof(char));
}
for(i = 0; i < LIM; ++i)
{
printf("Введите %d-ую строку\n", i+1);
fgets(massive_of_strings[i], CHAR_LIM, stdin);
}
for(i = 0; i < LIM; ++i)
{
printf("Вы ввели %d-ую строку - %s\n", i+1, massive_of_strings[i]);
}
string_sort(massive_of_strings, LIM, CHAR_LIM);
printf("Строки после сортировки\n");
for(i = 0; i < LIM; ++i)
{
printf("%d-ая строка - %s\n", i+1, massive_of_strings[i]);
}
return 0;
}
void string_sort(char **a, int lim, int char_lim)
{
int i, j;
char * temp = (char*)malloc(char_lim * sizeof(char));
for(i = 0; i < lim; ++i)
{
for(j = lim-1; j > i; --j)
{
if(strcmp(a[j],a[j-1]) < 0)
{
strcpy(temp, a[j]);
strcpy(a[j],a[j-1]);
strcpy(a[j-1], temp);
}
}
}
}
Объяснение кода листинга программы
- Ввод количества строк и символов в строке
- Выделение памяти под массив указателей на строки
- Выделение памяти под каждую строку в цикле
- Ввод строк с клавиатуры и сохранение их в массиве
- Вывод введенных строк на экран
- Сортировка массива строк с помощью функции string_sort
- Вывод отсортированных строк на экран
- В функции string_sort:
- Внутренний цикл для прохода по массиву строк в обратном порядке
- Сравнение двух строк с помощью функции strcmp
- Если первая строка меньше второй, то они меняются местами с помощью временной переменной temp
- Внешний цикл для прохода по всем строкам, кроме последней
- Завершение работы программы