#define MAX_ENTRY 100
//define struct
typedef struct StudentRecords
{
int StudentID;
char *Firstname;
char *Lastname;
char *Department;
float GPA;
} STUDENTRECORDS;
//initialize
STUDENTRECORDS StudentRecords[MAX_ENTRY];
跳到主要内部......
//allocate memory for the strings as required by the assignment
for(i=0;i<MAX_ENTRY;i++)
{
StudentRecords[i].Firstname = malloc(sizeof(char)*256);
StudentRecords[i].Lastname = malloc(sizeof(char)*256);
StudentRecords[i].Department = malloc(sizeof(char)*256);
}
while(EOF!=fscanf(fp, "%d %s %s %s %f\n", &StudentRecords[i].StudentID, StudentRecords[i].Firstname, StudentRecords[i].Lastname, StudentRecords[i].Department, &StudentRecords[i].GPA))
{
printf("%d %s %s %s %f\n", StudentRecords[i].StudentID, StudentRecords[i].Firstname, StudentRecords[i].Lastname, StudentRecords[i].Department, StudentRecords[i].GPA);
i++;
}
}
输入文件如下所示:
2040003 AAAA BBBBBBBBB ComputerScience 3.45
2040002 AAA CCC ElectricalEngineering 3.01
2040005 AAAAAAAAAAAAAAAAA BBB ComputerScience 3.60
我怎么得到StudentRecords [i]。学生ID从大的负数到0,到大的正数?
输入文件DO中的行使其成为结构,但也包括所有这些随机条目。我想如果我没有为结构中未使用的位置指定任何东西(它当前长度为100),它们就会保持空白。
如果我改变结构的大小(老实说,我不知道如何使其动态,也许这会有所帮助)到小于100的东西,我得到的是随机条目,但它们仍然存在。
答案 0 :(得分:1)
问题是没有分配空间来存储字符串。一种方法是将结构更改为:
typedef struct StudentRecords {
int StudentID;
char Firstname[100];
char Lastname[100];
char Department[100];
float GPA;
} STUDENTRECORDS;
然后您还应将scanf
更改为:
while(5 == fscanf(fp, "%d %99s %99s %99s %f\n",
&StudentRecords[i].StudentID,
StudentRecords[i].Firstname,
StudentRecords[i].Lastname,
StudentRecords[i].Department,
&StudentRecords[i].GPA))
// ...
答案 1 :(得分:1)
如果我理解你的问题,这听起来就像你打印结构的问题,空的那些给你随机的东西。这是因为您的StudentRecords数组未被静态声明,因此初始化时成员不会归零。因此,在分配内容之前,每个结构的内容都是随机/垃圾。如果你想初始化你的结构的内容说NULL /零尝试这个:
memset( &StudentRecords, 0, sizeof(StudentRecords));
然而,这不会解决您的数组中有空/未使用的结构的问题。为此,您可以简单地添加逻辑,以便在打印出来时跳过空的逻辑。有很多选项可以确定,一个简单的方法是在结构中添加一个标志:
int isUsed;
使用memset将其初始化为零。加载文件时,只需将值设置为1
即可。或者您可以使用其他感知值/逻辑组合。