0

好的,首先我将解释我的任务。对于这个任务,我必须使用我没有问题的动态内存分配。我遇到的问题是找出完成任务的正确方法。对于我的作业,我需要创建一个程序,提示用户输入他们有多少学生,然后询问以下信息;学生证、生日和电话号码。我需要使用循环来提示用户输入所有学生信息。我需要创建一个循环来扫描所有学生 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);
    }
}
4

3 回答 3

0

您正在重新定义 studentData

int * studentData= NULL;

然后稍后

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

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

于 2013-11-01T14:29:01.747 回答
0

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

  1. 从用户(每个结构)读取数据。
  2. 增加数组大小,添加新结构。
  3. 循环 1-2 直到输入用户完成添加新人(此处需要一些条件才能完成)。
  4. 找到必要的结构并打印出来。

所以第一步是从用户那里读取信息。您可以使用 scanf():以最简单的方式,您可以为每个字段逐步执行此操作:

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

如果成功,此函数应返回它读取的项目数(在您的情况下为 1)。对于电话,您应该使用 scanf("%ld", &phone)。

要调整数组大小,请使用函数 realloc() (#include :

realloc(&ptr_to_array, new_size);

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

于 2013-11-01T14:55:24.227 回答
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”,可能您想改写“students”。

至于用scanf读取数据,见上一条评论。

于 2013-11-01T17:18:06.277 回答