未分配的变量具有随机值

时间:2014-02-05 03:45:25

标签: c struct

#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的东西,我得到的是随机条目,但它们仍然存在。

2 个答案:

答案 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即可。或者您可以使用其他感知值/逻辑组合。