Не работает программа сортировки строк с помощью двумерного массива указателей - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Не работает программа сортировки строк с помощью двумерного массива указателей. Не подскажете где ошибка?
Листинг программы
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #define strlength 1000
  5. int main()
  6. {
  7. char **a; int i, j; int N;
  8. char s[strlength];
  9. scanf("%d", &N);
  10. a = (char **)malloc((N + 1) * sizeof(char *));
  11. for (i = 1; i <= N + 1; i++)
  12. {
  13. fgets(s, strlength, stdin);
  14. a[i] = (char *)malloc((strlen(s) + 1) * sizeof(char));
  15. strcpy(a[i], s);
  16. }
  17. for (i = 1; i <= N + 1; ++i)
  18. {
  19. strcpy(s, a[i]);
  20. j = i - 1;
  21. while ((j >= 0) && (strcmp(a[j], s) > 0))
  22. {
  23. strcpy(a[j + 1], a[j]);
  24. j = j - 1;
  25. }
  26. strcpy(a[j + 1], s);
  27. }
  28. for (i = 1; i <= N + 1; i++)
  29. fputs(a[i], stdout);
  30. for(i = 1; i < N; i++)
  31. {
  32. free(a[i]);
  33. }
  34. free(a);
  35. return 0;
  36. }
Немного исправил, теперь выдает на некоторых наборах debug ошибку.
Листинг программы
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #define strlength 1000
  5. int main()
  6. {
  7. char **a; int i, j; int N;
  8. char s[strlength];
  9. scanf("%d", &N);
  10. a = (char **)malloc((N + 1) * sizeof(char *));
  11. for (i = 0; i < N + 1 ; i++)
  12. {
  13. fgets(s, strlength, stdin);
  14. a[i] = (char *)malloc((strlen(s) + 1) * sizeof(char));
  15. strcpy(a[i], s);
  16. }
  17. for (i = 1; i < N + 1; ++i)
  18. {
  19. strcpy(s, a[i]);
  20. j = i - 1;
  21. while ((j >= 0) && (strcmp(a[j], s) > 0))
  22. {
  23. strcpy(a[j + 1], a[j]);
  24. j = j - 1;
  25. }
  26. strcpy(a[j + 1], s);
  27. }
  28. for (i = 0; i < N +1; i++)
  29. fputs(a[i], stdout);
  30. for(i = 0; i < N; i++)
  31. {
  32. free(a[i]);
  33. }
  34. free(a);
  35. return 0;
  36. }

Решение задачи: «Не работает программа сортировки строк с помощью двумерного массива указателей»

textual
Листинг программы
  1. .........................
  2. char* tmp;
  3. ..................
  4. for (i = 1; i < N + 1; ++i)
  5.         {
  6.             tmp=a[i];
  7.             j = i - 1;
  8.  
  9.             while ((j >= 0) && (strcmp(a[j], tmp) > 0))
  10.                 {
  11.                     a[j + 1]=a[j]);
  12.                     j = j - 1;
  13.                 }
  14.             a[j + 1]=tmp;
  15.         }

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

В данном коде реализуется алгоритм сортировки пузырьком для массива строк, используя двумерный массив указателей. Ниже представлена последовательность действий:

  1. Переменная tmp инициализируется значением a[i] (пустая строка).
  2. В каждой итерации цикла 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.
  3. Значение tmp не используется в цикле, поэтому предполагается, что оно не влияет на работу алгоритма.
  4. Код не содержит обработки ошибок или проверки на выход за границы массива, что может привести к неопределенному поведению программы.
  5. Код не содержит вывода на экран, поэтому результаты сортировки не отображаются.

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


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

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

7   голосов , оценка 4.143 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы