#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;
}