Не выводит символы

Рейтинг: 0Ответов: 1Опубликовано: 15.05.2023

Написал программу, которая увеличивает размер массива структур и вводит в него новые данные. Программа принимает введённые с клавиатуры значения параметров интернет-тарифа, после чего выводит на экран список тарифов с введённым новым тарифом. Однако вместо значений нового тарифа выводится какая-то абракадабра, видимо адреса ячеек памяти. Как сделать так, чтобы введённые значения выводились правильно?

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


struct LIST
{
    char name[20];
    double cost;
    double speed;
    double traffic_volume;
    char time[20];
};


void list_init(struct LIST* list);
void print(struct LIST* list, int list_size);
void second_act(int* list_size, struct LIST* list);


int main()
{
    setlocale(LC_ALL, "Russian");
    system("chcp 1251");
    struct LIST* list = (struct LIST*)malloc(4 * sizeof(struct LIST));
    int list_size = 4, position;
    list_init(list);
    second_act(&list_size, list);
    print(list, list_size);
    return 0;
}


void list_init(struct LIST* list)
{
    strcpy_s(list[0].name, 20, "Light");
    list[0].cost = 30;
    list[0].speed = 2;
    list[0].traffic_volume = 700;
    strcpy_s(list[0].time, 20, "Неограничено");

    strcpy_s(list[1].name, 20, "Fat");
    list[1].cost = 38;
    list[1].speed = 1.5;
    list[1].traffic_volume = 1500;
    strcpy_s(list[1].time, 20, "Неограничено");

    strcpy_s(list[2].name, 20, "Fast");
    list[2].cost = 45;
    list[2].speed = 5;
    list[2].traffic_volume = 700;
    strcpy_s(list[2].time, 20, "Неограничено");

    strcpy_s(list[3].name, 20, "Ultra");
    list[3].cost = 80;
    list[3].speed = 10;
    list[3].traffic_volume = 1000;
    strcpy_s(list[3].time, 20, "Неограничено");
}

void print(struct LIST* list, int list_size)
{
    printf("     Название тарифа\tЦена(Рубли)\tСкорость(Мбит/с)\tОбъём трафика(Гб)\t       Время доступа\n");
    for (int i = 0; i < list_size; i++)
    {
        printf("%20s\t%11.f\t%16.f\t%17.f\t%20s\n", list[i].name, list[i].cost, list[i].speed, list[i].traffic_volume, list[i].time);
    }
    printf("\n\n");
}

void second_act(int* list_size, struct LIST* list)
{
            (*list_size)++;
            list = (struct LIST*)realloc(list, (*list_size) * sizeof(struct LIST));
            puts("Название тарифа:");
            scanf_s("%s", &list[*list_size].name, 20);
            puts("Цена в рублях:");
            scanf_s("%f", &list[*list_size].cost);
            puts("Скорость в Мбит/с:");
            scanf_s("%f", &list[*list_size].speed);
            puts("Объём трафика:");
            scanf_s("%f", &list[*list_size].traffic_volume);
            puts("Время доступа:");
            scanf_s("%s", &list[*list_size].time, 20);
}

Ответы

▲ 1Принят

Переменная list_size в void second_act(int* list_size, имеет время жизни до конца функции. Вы должны передавать адрес это переменной в функцию, чтобы переменная в функции main увидела изменения.
В первой функции list_init(struct LIST* list) вы не меняли указатель, и это работало, а во второй функции уже надо так :

void second_act ( int* list_size, struct LIST * * listp ) {
  (*list_size)++;
  ( * listp ) = realloc( ( * listp ) , (*list_size) * sizeof(struct LIST));
  puts("Название тарифа:");
  scanf_s("%s", & ( * listp ) [ ( * list_size ) - 1 ] . name, 20);
  ..

}

С переменной list_size вы то-же самое делали, передавая её указатель. С указателем на list то-же самое надо делать.

  second_act ( & list_size , & list ) ;

Вы выходите за пределы выделенной памяти и её портите. У последнего элемента индекс равен (размер памяти - 1).