Логическая ошибка сортировки выбора

#c #arrays #string #logic #selection

#c #массивы #строка #Логические #выбор

Вопрос:

Я использую сортировку выбора для сортировки списка имен из команды по крикету.

Сортировка выполняется после первого повторения имени 3 раза, что исключает два других имени из массива, который я сортирую.

Ввод из массива (по порядку):

Кларк Уотсон Бир Коупленд Хаддин Харрис Хьюз Хасси Джонсон Хаваджа Лайон Марш Паттинсон Понтинг Сиддл Уорнер

Вывод после сортировки массива:

Пиво Пиво Пиво Коупленд Хаддин Харрис Хьюз Хасси Джонсон Хаваджа Лайон Марш Паттинсон Понтинг

Код:

 void sort_names (Team_t player[]) {
    int pos;
    int min;
    int i, str_check;
    char *temp = NULL;

    for (pos = 0; pos < MAX_PLYR; pos  ) {
        min = pos;

        for (i = (pos   1); i < MAX_PLYR; i  ) {
            str_check = strcmp(player[i].pname, player[min].pname);

            if (str_check < 0) {
                min = i;
            }

        }

        if (min != pos) {
            temp = player[pos].pname;
            strcpy(player[pos].pname, player[min].pname);
            strcpy(player[min].pname, temp);
        }
    }    
}
  

Комментарии:

1. Вы пробовали просматривать код с помощью отладчика (или даже ручки и бумаги), чтобы посмотреть, что происходит?

2. Возможно, я что-то пропустил, я проверил это несколько раз и установил точку останова.

3. Ваш код напился после получения «пива» :-/

Ответ №1:

Эта часть вашего кода не будет корректно менять местами записи:

 temp = player[pos].pname;
strcpy(player[pos].pname, player[min].pname);
strcpy(player[min].pname, temp);
  

В первой строке сохраняется указатель на имя игрока «pos» temp , а не само имя. Затем первый strcpy перезаписывает его — он теряется. (Второй strcpy просто копирует ту же строку обратно туда, где она уже была.) Вот почему вы видите, что элемент, который будет отсортирован первым, появляется более одного раза.

Комментарии:

1. Правильно. И, вероятно, лучше и безопаснее сортировать не строки, а указатели на них, pname значения внутри player[] .

2. Спасибо, Мартин! Решил это. Теперь я понимаю, что я делал неправильно