@Retr0Hacker

Как отсортировать данные структуры по алфавиту?

Задание
С клавиатуры ввести последовательность структур, содержащих данные о
результатах сессии студентов группы: <Фамилия, имя>, <Список рейтинговых
оценок>. Распечатать введенные данные в виде таблицы, отсортировав их по
фамилиями студентов в алфавитном порядке. Определить студентов с
самым высоким средним рейтинговым баллом.

Мой код
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<string.h>
 
using namespace std;
 
struct Student
{
    char familia[20];
    int exam;
};
void main()
{
    Student sot[128];
    int i, j, a, m;
    char* str;
    cout << "Введите количество студентов: ";
    cin >> a;
    for (i = 0; i < a; i++)
    {
        cout << "\nФамилия " << i + 1 << "-ого студента: ";
        cin >> sot[i].familia;
        cout << "\nРезультаты сессии:  ";
        cin >> sot[i].exam;
    }
 
    for (j = 0; j <= a; j++)
    {
        for (i = 1; i < a; i++)
        {
            if (strcmp(sot[i - 1].familia, sot[i].familia) > 0)
            {
 
                strcpy(str, sot[i - 1].familia);
                strcpy(sot[i - 1].familia, sot[i].familia);
                strcpy(sot[i].familia, str);
            }
        }
    }
    for (i = 0; i < a; i++)
    {
        cout << sot[i].familia << endl;
        cout << sot[i].exam << endl << endl;
    }
}


Но, увы, возникает ошибка: Ошибка C4700 использована неинициализированная локальная переменная "str".
Подскажите как можно устранить эту проблему или покажите другой способ сортировки структур(qsort, увы, не канает)?
  • Вопрос задан
  • 1453 просмотра
Пригласить эксперта
Ответы на вопрос 3
wataru
@wataru Куратор тега C++
Разработчик на С++, экс-олимпиадник.
У вас заводится переменная str, и как и компилятор вам говорит, вы ее ничем не инициализируете. А ниже используете в strcpy(str, sot[i - 1].familia). Эта функция принимает указатель на область памяти, куда надо скопировать строку. Но указатель указывает на случайное место. Т.е. программа, даже если чудом скомпилируется, упадет с исключением.

Вам надо или для str выделять память через malloc, или объявить str массивом char фиксированного размера, как поле familia у структуры.
Ответ написан
Комментировать
includedlibrary
@includedlibrary
Используйте тип
char str[20];
Если использовать указатель, как вы сейчас делаете, нужно его инициализировать, иначе копировать strcpy будет невесть куда (но скорее всего просто будет segfault)
Ответ написан
Комментировать
Adamos
@Adamos
При чем здесь С, если первым же делом объявляется using namespace std?
Если все равно используется стандартная библиотека, на кой черт эти char и пляски с бубном?
std::string для строк
std::sort для сортировки (добавив коллбек для сравнения строк) или std::swap, если предпочитаете велосипедный алгоритм.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы