19
Апр
2021

Вызывает исключение в строке с strcpy. Очереди/Си

Задание: создать очередь клиент банка с помощью структуры и написать банальные функции(вствки, удаления, сортировки и т.д.) В 94 строке выдает исключение. Помогииите, плиз.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h> 
#include <locale.h> 
#include <conio.h> 
#include <string.h> 
#include <malloc.h>
#define OFF 0 
#define ON 1
#define STR_SIZE 30
struct client {
    char name[STR_SIZE];
    int num;
    int sum;
    char date[STR_SIZE];
};
client* Inf[30], temp;
struct node
{
    client* data;
    node* next; 
};
struct node1
{
    node* head;
    node* tail;
};
int length(node1* begin);
node1* add(client*, node1* begin);
node1* deleteFirst(node1* begin);
void print(node1* begin);
node1* sortirovka(node1* begin);
void addInformation(client*c);
int counter;
int main()
{
    node1* current = (node1*)malloc(sizeof(node1));
    current->head = NULL;
    current->tail = NULL;
    setlocale(LC_ALL, "rus");
    int choice = 0;
    do
    {
        printf("1. Ввод элемента структуры\n"
            "2. Удаление первого элемента из очереди\n"
            "3. Определение длины очереди\n"
            "4. Вывод на экран массива структур\n"
            "5. Сортировка\n"
            "6. Выход\n"
            "Ваш выбор: ");
        scanf_s("%d", &choice);
        switch (choice)
        {
        case 1:
            printf("Введите количество записей\n");
            scanf_s("%d", &counter);
            
            for (int i = 0; i < counter; i++) {
                addInformation(Inf[i]);
                add(Inf[i], current);
            }
            break;
    
        case 2:
            deleteFirst(current);
            break;
        case 3:
            printf("Длина очереди= %d\n", length(current));
            break;
        case 4:
            print(current);
            break;
        case 5:
            sortirovka(current);
            print(current);
            break;
        case 6:
            break;
        default:
            printf("\nОшибка : Данного пункта меню не существет!\n");
        }

    } while (choice != 7);
    _getch();
    return 0;
}

void addInformation(client*c) {
        char buf[30];
        rewind(stdin);

            printf("--------------------------------------------------------------------\n");
            printf("Введите имя клиента: ");
            gets_s(buf);
            strcpy(c->name, buf);
            printf("Введите номер: ");
            scanf_s("%d", &c->num);
            printf("Введите сумму: ");
            scanf_s("%d", &c->sum);
            printf("Введите дату: ");
            scanf_s("%d", &c->date);
        
}
node1* sortirovka(node1* nod) {
        
        node* current_i = nod->head;
        node* current_j = (node*)malloc(sizeof(node));
        client* tmp = (client*)malloc(sizeof(client));
        node* min = (node*)malloc(sizeof(node));

        while (current_i)
        {
            min = current_i;
            current_j = current_i->next;

            while (current_j)
            {
                if (min->data->num > current_j->data->num)
                {
                    min = current_j;
                }
                current_j = current_j->next; // j++
            }
            tmp = current_i->data;
            current_i->data = min->data;
            min->data = tmp;
            
            current_i = current_i->next; // i++
        }
        return nod;
    }

int length(node1* nod)
{
    int c = 0;
    node* current = nod->head;
    if (nod->head && nod->tail)
    {
        if (nod->tail == nod->head)
        {
            c = 1;
        }
        else
        {
            while (current)
            {
                c++;
                current = current->next;
            }
        }
    }
    else
    {
        c = 0;
    }
    return c;
}

node1* add(client* info, node1* nod)
{
    node* n = (node*)malloc(sizeof(node));
    client* tmp = (client*)malloc(sizeof(client));
    tmp = info;
    n->data = tmp;
    n->next = NULL;
    if (nod->head && nod->tail)
    {
        nod->tail->next = n;
        nod->tail = n;
    }
    else
    {
        nod->tail = nod->head = n;
    }
    return nod;
}

node1*  deleteFirst(node1* nod){
    node* n = (node*)malloc(sizeof(node));
    client* tmp = (client*)malloc(sizeof(client));
    if (nod->head && nod->tail)
    {
        n = nod->head;
        nod->head = nod->head->next;
        tmp = n->data;
        free(n);
    }
    else
    {
        printf("Queue is empty.\n");
    }
    return nod;
}

void print(node1* nod){
    node* current = (node*)malloc(sizeof(node));
    if (nod->head && nod->tail)
    {
        current = nod->head;
        while (current)
        {
            printf("%s %d %d %d\n", current->data->name, current->data->num, current->data->sum, current->data->date);
            current = current->next;
        }
    }
    else
    {
        printf("\t--//--NONE--//--\n");
    }
    free(current);

}

Источник: https://ru.stackoverflow.com/questions/1271959/%D0%92%D1%8B%D0%B7%D1%8B%D0%B2%D0%B0%D0%B5%D1%82-%D0%B8%D1%81%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D0%B5-%D0%B2-%D1%81%D1%82%D1%80%D0%BE%D0%BA%D0%B5-%D1%81-strcpy-%D0%9E%D1%87%D0%B5%D1%80%D0%B5%D0%B4%D0%B8-%D0%A1%D0%B8

Тебе может это понравится...

Добавить комментарий