C Как сделать ввод/печать структуры с помощью указателей

#c

Вопрос:

 struct Student
{
    char* name;
    int balls;
};

void inputdata(Student **s, int *n)
{
    int nn;
    printf("%sn", "Input amount of students");
    scanf("%i", amp;nn);
    Student* a = new Student[nn];
    for (int i = 0; i < nn;   i)
    {
        scanf("%s", amp;a[i].name);
        scanf("%i", amp;a[i].balls);
    }
    n = amp;nn;
    s = amp;a;
}
void print(Student **s, int n)
{
    for (int i = 0; i < n;   i)
    {
        printf("%s %in", s[i]->name, s[i]->balls);
    }
}

int main(int argc, char const *argv[])
{
    Student** s;
    int *n;
    inputdata(s, n);
    print(s, *n);
    return 0;
}
 

Итак, как я должен вводить данные и печатать данные на экране консоли.
Я вроде как ввел данные, хорошо, не могу распечатать их на своем экране. Программа заканчивается. Что я должен здесь исправить?

Комментарии:

1. Почему бы не std::vector<Student> вместо необработанных массивов?

2. мне нужна старая технология. 🙁 Я все еще не понимаю, как я должен это распечатать.

Ответ №1:

  • Вы должны передавать указатели на то, что должно быть изменено в вызываемых функциях.
  • Вызываемые функции должны разыменовывать указатели, передаваемые для изменения того, что должно быть изменено.
  • Вы должны выделить строки перед чтением.
  • Непоследовательно, что в функции требуется массив из Student inputdata , но в функции требуется массив из Student* print .
  • Вы должны ограничить максимальную длину для чтения количеством элементов в буфере минус один, чтобы предотвратить переполнение буфера при использовании %s . «Минус один» предназначен для завершения нулевого символа.

Фиксированный код:

 #include <cstdio>

struct Student
{
    char* name;
    int balls;
};

void inputdata(Student **s, int *n)
{
    int nn;
    printf("%sn", "Input amount of students");
    scanf("%i", amp;nn);
    Student* a = new Student[nn];
    for (int i = 0; i < nn;   i)
    {
        a[i].name = new char[4096];
        scanf("@95s", a[i].name);
        scanf("%i", amp;a[i].balls);
    }
    *n = nn;
    *s = a;
}
void print(Student *s, int n)
{
    for (int i = 0; i < n;   i)
    {
        printf("%s %in", s[i].name, s[i].balls);
    }
}

int main(int argc, char const *argv[])
{
    Student* s;
    int n;
    inputdata(amp;s, amp;n);
    print(s, n);
    return 0;
}