Динамический массив символьного типа - трудности - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Здравствуйте! Во время выполнения задания "Создать структуру <студент> с полями: Студ.код, Фамилия, Предмет, Оценка. Создать динамический массив студентов. Предметов и оценок должно быть несколько. Реализовать вывод информации о студентах". Собственно, возникла следующая проблема: У меня не получается создать работающий динамический массив типа char для введения названий предметов.
#include<stdio.h>
#include<conio.h>

struct student{
    char code[6];
    char surname[25];
    char *Subject;       
    int *Mark;
};
 
void EnterStudent(student *Arr, int k);
void PrintStudent(student Arr, int k);

int main()
{   
    int n;
    printf("Enter the number of students -> ");
    scanf("%i",&n);
    student *Arr = new student[n];
    
    int k;
    printf("enter the number of subjects -> ");
    scanf("%i",&k);
 
    for(int i=0; i<n; i++)
    {
        EnterStudent(&Arr[i], k);
        printf("\n");
    }
    
    for(int i=0; i<n; i++)
        PrintStudent(Arr[i], k);

getch();
return 0;
}
 
void EnterStudent(student *Arr, int k)
{
    getchar();
    printf("\nEnter the code -> ");
    gets(Arr -> code);
    printf("Enter the Surname -> ");
    gets(Arr -> surname);
 
    printf("Enter Subjects : ");
    Arr->Subject = new char[k];              //Вот тут и начинаются проблемы
    for(int i=0; i<k; i++)
        gets(Arr -> Subject);  // Если я пишу Subject[i] , то компилятор ругается следующим образом:
                                                        //  'gets' : cannot convert parameter 1 from 'char' to 'char *'
                                                       
             printf("Enter Marks : ");
    Arr->Mark = new int[k];
    for(int i=0; i<k; i++)
        scanf("%i",&(Arr -> Mark[i]));
}
 
void PrintStudent(student Arr, int k)
{
    printf("\n%s   %s\n", Arr.code, Arr.surname);
    for(int i=0; i<k; i++)
        printf("%s   %i\n", Arr.Subject, Arr.Mark[i]);
}

Решение задачи: «Динамический массив символьного типа - трудности»

textual
Листинг программы
...
char **Subject;
...
Arr->Subject = new char*[k]; 
...
Arr->Subject[i] = new char[100];
gets(Arr->Subject[i]); 
...
printf("%s   %i\n", Arr.Subject[i], Arr.Mark[i]);

Объяснение кода листинга программы

  1. Объявляется динамический массив символьного типа Subject с помощью указателя на указатель.
  2. Выделяется память под массив указателей на строки с помощью оператора new.
  3. Для каждого элемента массива Subject выделяется память под строку с помощью оператора new.
  4. В каждую строку массива Subject записывается значение с помощью функции gets.
  5. Выводится на экран значение строки и соответствующий ей числовой индекс с помощью функции printf.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

11   голосов , оценка 4.182 из 5
Похожие ответы