Хорошо, сначала я объясню свое задание. Для этого задания я должен использовать динамическое распределение памяти, с которым у меня нет проблем. У меня возникла проблема с тем, чтобы выяснить правильный способ работы с моим заданием. Для моего задания мне нужно создать программу, предлагающую пользователю ввести количество студентов, которые у них есть, затем запросить следующую информацию; Идентификатор студента, Дата рождения и номер телефона. Мне нужно использовать цикл, чтобы побудить пользователя ввести всю информацию о студентах. Мне нужно создать цикл, который будет проверять все идентификаторы студента и найти самого старого ученика, использующего дату рождения (цикл должен быть способен сканировать более трех учеников).
Вот мой код, у меня есть некоторые предложения и даже кусочки кода от вас, ребята, но после их реализации я еще больше смущен тем, что должен делать. Пожалуйста, взгляните на него и критикуйте меня.
EDIT: Я также добавил в код, где я получаю и ошибка
Спасибо.
#include #include int main (void) { int * studentData= NULL; int * studentDataType=NULL; int students; int studentID; int year; int month; int day; long long phone; printf("How many students are you entering records for:\n"); scanf("%d", &students); studentData=(int*)malloc((sizeof(int)*students)); struct studentDataType { int studentID; int year; int month; int day; long long phone; }; //invalid operands to binary * (have 'int' and 'int *') studentDataType *studentData = (studentDataType*)malloc(numberOfStudents *sizeof(studentData)); for (int i = 0 ; i < students ; ++i) { printf("%d, %d, %d, %d, %d\n", studentID, year, month, day, phone); } }
Вы переопределяете studentData
int * studentData= NULL;
тогда позже
studentDataType *studentData = (studentDataType*)malloc(numberOfStudents * sizeof(studentData));
studentDataType
вы должны объявить структуру studentDataType
(вне main()
), а затем использовать ее в своем первоначальном объявлении
Чтобы увидеть задачу, лучше, по крайней мере, в первый раз написать некоторую блок-схему того, что вы должны делать в программе. В твоем случае:
Итак, первый шаг – прочитать информацию от пользователя. Вы можете использовать scanf (): самым простым способом вы можете сделать это шаг за шагом для каждого поля:
#include ... int value; scanf("%d", &value); ...
В случае успеха эта функция должна возвращать количество элементов, которые она читает (1 в вашем случае). Для телефона вы должны использовать scanf («% ld» и телефон).
Для изменения размера массива используйте функцию realloc () (#include:
realloc(&ptr_to_array, new_size);
Каждый элемент массива является указателем на структуру «ученик». Следующие шаги схожи.
Первая проблема заключается в том, что у вас есть имена переменных, аналогичные имени типа. Хотя вы можете иметь это в C в определенной степени, например:
typedef int x; x foo (xx) { return x; }
Было бы неплохо не делать этого для целей читаемости. Поэтому в вашем случае у вас есть:
int * studentData= NULL; int * studentDataType= NULL;
который является именем переменной, тогда у вас есть:
struct studentDataType ...
который является именем типа (должен использоваться как struct studentDataType, а не без структуры, как и вы); в конце концов
studentDataType *studentData = ...
обрабатывается компилятором как операция по двум переменным, а не объявлению типа, как вы ожидали. Таким образом, ваше распределение памяти должно быть:
struct studentDataType *studentData = malloc(numberOfStudents *sizeof(struct studentData));
В результате возникает проблема, когда вы переопределяете studentData, которую вы указали в начале программы, и «numberOfStudents» не определен, возможно, вы хотели написать вместо этого «учеников».
Что касается данных чтения с scanf, см. Предыдущий комментарий.