Задан массив структур, содержащий фамилии и название группы. Массив привести в порядок по фамилиям
Дебагер выдаёт ошибку в 54 строке "Вызвано исключение по адресу 0x00007FF96A5BDEFE (ucrtbased.dll) в Project1.exe: 0xC0000005: нарушение прав доступа при записи по адресу 0x00007FF643F1AD8C."
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
#define N 5
struct st_info
{
char* surname;
char group[5];
};
void SortAndPrint(struct st_info* st);
void main()
{
struct st_info st[N];
int j;
char* Surnames[5] = { "Tesla", "Twen", "Zelenskyi", "Tesla", "Jonson" };
srand(time(NULL));
for (j = 0; j < N; j++)
{
printf("Enter group:\n");
gets(st[j].group);
st[j].surname = Surnames[rand() % 5];
}
printf("\n");
for (j = 0; j < N; j++)
{
printf("Surname: %s\n", st[j].surname);
printf("Group: %s\n", st[j].group);
}
printf("\n-------------------------------------------------------\n");
SortAndPrint(&st);
}
void SortAndPrint(struct st_info* st)
{
int i, j;
//сортировка
for (i = 0; i < N-1; i++)
for (j = i + 1; j < N; j++)
if (strcmp(st[i].surname, st[j].surname) > 0)
{
char cur[64];
strcpy_s(cur, sizeof(cur), st[i].surname);
strcpy_s(st[i].surname, sizeof(st[i].surname), st[j].surname);
strcpy_s(st[j].surname, sizeof(st[j].surname), cur);
}
printf("Results:\n");
for (i = 0; i < N; i++)
{
printf("Surname: %s\n", st[i].surname);
printf("Group: %s\n", st[i].group);
}
printf("\n");
}
Ответы (1 шт):
Начнем с того, что вызывать надо SortAndPrint(st);.
Но главное — вы просто присваиваете полю указатель на строковый литерал SortAndPrint(st);, а потом пытаетесь его копировать —
strcpy_s(st[i].surname, sizeof(st[i].surname), st[j].surname);
Во-первых, куда? В строковый литерал, который менять нельзя?
Во-вторых, sizeof(st[i].surname) — это размер указателя (впрочем, в данном случае это уже неважно, поскольку в любом случае выделенной памяти для записи строк у вас нет).
Вам надо обменивать не содержимое строк (нет его у вас как такового), а просто указатели!