Сортировка строк (ошибка сегментации) - 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);
            }
        }
    }
}

Объяснение кода листинга программы

  1. Ввод количества строк и символов в строке
  2. Выделение памяти под массив указателей на строки
  3. Выделение памяти под каждую строку в цикле
  4. Ввод строк с клавиатуры и сохранение их в массиве
  5. Вывод введенных строк на экран
  6. Сортировка массива строк с помощью функции string_sort
  7. Вывод отсортированных строк на экран
  8. В функции string_sort:
    • Внутренний цикл для прохода по массиву строк в обратном порядке
    • Сравнение двух строк с помощью функции strcmp
    • Если первая строка меньше второй, то они меняются местами с помощью временной переменной temp
    • Внешний цикл для прохода по всем строкам, кроме последней
  9. Завершение работы программы

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 3.933 из 5
Похожие ответы