Как вывести двумерный строковый массив с пузырьковой сортировкой в ​​C?

Как мне отсортировать двумерный массив строк в C с помощью пузырьковой сортировки (или любого другого вида сортировки в этом отношении)? То, что я действительно пытаюсь сделать, выглядит следующим образом:

Пример:

Несортированный двумерный массив строк:

abfg 
abcd 
xyzw 
pqrs 
orde

Отсортированный двумерный массив строк:

abcd 
abfg 
orde 
pqrs 
xyzw

Мой текущий алгоритм, который не работает (выдает ошибку несовместимости), выглядит следующим образом:

#include <stdio.h>
#include<string.h>



int main()
{
    char str[5][4];
    int i,j;
    char temp[4];
    for (i=0;i<5;i++)
    {
        scanf("%s",str[i]);

    }


   for(i = 0; i<5-1; i++) 
   { 
     for(j = 0; j<5-1; j++) 
     {
         if(strcmp(str[j],str[j+1])== -1) 
        { 
            temp = str[j]; 
            str[j] = str[j+1]; 
            str[j+1] = temp; 
         }

     } 
   } 

   for(i = 0; i< 5; i++) 
     printf("%s ", str[i]);


    return 0;
}

person aero    schedule 11.03.2015    source источник
comment
Во-первых, я бы реализовал алгоритм пузырьковой сортировки, сортирующий что угодно. Затем я решал, был ли мой 2D-массив на самом деле массивом char указателей или массивом char массивов (они не синонимы). Затем я поместил соответствующий код сравнения и замены в пузырьковую сортировку, чтобы соответствующим образом обработать любой результат этого решения.   -  person WhozCraig    schedule 12.03.2015
comment
@WhozCraig, я уже сделал это, но выдает ошибку несовместимости:   -  person aero    schedule 12.03.2015
comment
Обновите свой вопрос и опубликуйте код. См. Как создать минимальный, полный и проверяемый пример?.   -  person WhozCraig    schedule 12.03.2015
comment
Хорошо, потому что это не место в комментарии; это неотъемлемая часть вашего вопроса.   -  person WhozCraig    schedule 12.03.2015
comment
Я имею в виду, что мне сказали, что в этом случае я должен использовать функцию strcpy, но я не уверен, как это сделать.   -  person aero    schedule 12.03.2015
comment
Спасибо. Ваш код ближе к правильному, чем вы думаете. Массивы не являются назначаемыми значениями lvalue в C, вам нужно выполнить некоторое копирование буфера, чтобы поменять местами элементы.   -  person WhozCraig    schedule 12.03.2015
comment
Да, у меня возникла проблема с реализацией функции (strcpy), я не знаю, как мне это сделать.   -  person aero    schedule 12.03.2015


Ответы (1)


Массивы не могут быть назначены, как вы пытаетесь в C. Вам нужно настроить некоторую логику подкачки буфера. Например.

if(strcmp(str[j+1],str[j]) < 0) // note: fixed. 
{
    strcpy(temp, str[j]);
    strcpy(str[j], str[j+1]);
    strcpy(str[j+1], temp);
}            

Другие проблемы с вашим кодом:

  • Неправильный размер вашего входного массива. Для всех этих строк требуется не менее char[5] для хранения строк из четырех символов (включая место для терминатора).
  • Вы не ограничиваете длину входной строки. Для массива из четырех символов строка формата должна быть "%3s", что намекало бы на то, что ваши размеры были слишком короткими для начала.
  • Вы не подтверждаете успешность ввода, проверяя результат scanf
  • В связи с вышеизложенным, вы знаете, сколько успешных входных данных было достигнуто, поэтому вы не знаете, отсортированы ли ваши данные против неопределенного мусора. Если вы успешно ввели только 3 строки, сортировка массива из 5 строк бессмысленна.
  • Ваша пузырьковая сортировка реализована неправильно. Настоящая пузырьковая сортировка включает обнаружение перестановки, которая останавливает алгоритм сортировки после того, как любой заданный проход не приводит к перестановке. Вы также не уменьшаете количество элементов, сканируемых с каждой итерацией, на один, что в первую очередь является точкой пузырьковой сортировки.

В любом случае, все это связано с вашим кодом, но не с вопросом, который вы разместили. Стоит посмотреть несмотря ни на что.

Удачи.

person WhozCraig    schedule 12.03.2015
comment
@aero Пример решения вышеуказанных проблем см. здесь - person WhozCraig; 12.03.2015