我如何使用结构?

时间:2013-11-01 14:22:04

标签: c loops structure dynamic-memory-allocation

首先我会解释我的任务。对于这个分配,我必须使用动态内存分配,我没有遇到任何问题。我遇到的问题是找出正确的工作方式。对于我的任务,我需要创建一个程序,提示用户输入他们有多少学生,然后要求提供以下信息;学生证,出生日期和电话号码。我需要使用循环来提示用户输入所有学生信息。我需要创建一个循环,扫描所有学生ID并使用他们的生日找到最老的学生(循环必须能够扫描超过3名学生)。

这是我的代码,我已经从你们那里获得了一些建议甚至是一些代码,但是在实现它们之后,我对我应该做的事情更加困惑。请看一看并批评我。

编辑:我还在我收到的代码中添加了错误

谢谢。

#include <stdio.h>
#include <stdlib.h>

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

3 个答案:

答案 0 :(得分:0)

您正在重新定义studentData

int * studentData= NULL;

然后再

studentDataType *studentData = (studentDataType*)malloc(numberOfStudents * sizeof(studentData));

您应首先声明studentDataType结构(在main()之外),然后在原始声明中使用它

答案 1 :(得分:0)

要查看任务,最好至少第一次写一些程序中你必须做的块方案。在你的情况下:

  1. 从用户(每个结构)读取数据。
  2. 增加数组大小,添加新结构。
  3. 循环1-2直到输入用户完成添加新人(此处需要一些条件才能完成)。
  4. 找到必要的结构并打印出来。
  5. 所以第一步是从用户那里读取信息。你可以使用scanf(): 用最简单的方法,您可以逐步为每个字段执行此操作:

    #include <stdio.h>
    ...
    int value;
    scanf("%d", &value);
    ...
    

    如果成功,此函数应返回它读取的项目数(在您的情况下为1)。 对于手机,你应该使用scanf(“%ld”,&amp; phone)。

    调整数组使用函数realloc()的大小(#include:

    realloc(&ptr_to_array, new_size);
    

    数组的每个元素都是指向结构“student”的指针。 接下来的步骤类似。

答案 2 :(得分:0)

第一个问题是您的变量名称与类型名称相同。虽然你可以在某种程度上使用C语言,例如:

typedef int x;
x foo (x x)
{
  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的阅读数据,请参阅上一条评论。