我如何使用结构?
好的,首先我会解释我的任务。 对于这个分配,我必须使用动态内存分配,我没有遇到任何问题。 我遇到的问题是弄清楚正确的工作方式。 对于我的任务,我需要创建一个程序,提示用户输入他们有多少学生然后要求提供以下信息; 学生证,出生日期和电话号码。 我需要使用循环来提示用户输入所有学生信息。 我需要创建一个循环,它将扫描所有学生ID并使用他们的生日找到最老的学生(循环必须能够扫描超过3名学生)。
这是我的代码,我已经从你们那里获得了一些建议甚至一些代码,但是在实现它们之后,我对我应该做的事情更加困惑。 请看一看并批评我。
编辑:我还添加了我收到的代码和错误
谢谢。
#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
结构(在main()
),然后在原始声明中使用它
要查看任务,至少在第一次编写一些程序中你必须要做的块方案时会更好。 在你的情况下:
- 从用户(每个结构)读取数据。
- 增加数组大小,添加新结构。
- 循环1-2直到输入用户完成添加新人(这里需要一些条件才能完成)。
- 找到必要的结构并打印出来。
所以第一步是从用户那里读取信息。 您可以使用scanf():以最简单的方式,您可以逐步为每个字段执行此操作:
#include ... int value; scanf("%d", &value); ...
如果成功,此函数应返回它读取的项目数(在您的情况下为1)。 对于手机,你应该使用scanf(“%ld”,和手机)。
调整数组使用函数realloc()的大小(#include:
realloc(&ptr_to_array, new_size);
数组的每个元素都是指向结构“student”的指针。 后续步骤类似。
第一个问题是您的变量名称与类型名称相同。 虽然你可以在某种程度上使用C语言,例如:
typedef int x; x foo (xx) { return x; }
为了可读性目的,不这样做可能是个好主意。 所以在你的情况下你有:
int * studentData= NULL; int * studentDataType= NULL;
这是一个变量名,那么你有:
struct studentDataType ...
这是一个类型的名称(应该用作struct studentDataType,而不是像你一样没有struct); 最后
studentDataType *studentData = ...
被编译器视为对两个变量的操作,而不是您期望的类型声明。 所以你的内存分配需要是:
struct studentDataType *studentData = malloc(numberOfStudents *sizeof(struct studentData));
这会带来一个问题,即您重新定义了在程序开头声明的studentData,并且未定义“numberOfStudents”,可能您想要编写“学生”。
至于使用scanf读取数据,请参阅上一条评论。