不确定结构是否已初始化

时间:2014-08-11 13:50:46

标签: c

从我上一篇文章中我逐块处理我的代码,以确保它全部正常工作,并且有一些非常奇怪的事情发生。

如果你看一下我的代码,当谈到用唯一的学生ID初始化结构时,它会很乐意在每个人在for循环中初始化之后打印它们(这表明它显然已经完成了它)但是, ,当我想在另一个for循环中的for循环之外再次打印它们作为“仔细检查”时,它出现了可怕的错误,可能是它们根本不在那里?

如果你将代码遍历到底部,你会看到我的评论。

#include <stdio.h>

#include <string.h>
#include <stdlib.h>

#define ROWS 80
#define SIZE 100
#define STUDENTS 20

int string_compare(void const *x, void const *y)
{
    return strcmp(*(char**)x, *(char**)y);
}


struct student
{
    char student_ID[SIZE];
};



int main(void)
{
    FILE* input;
    int i,j,data_items;
    int records=0;
    char buffer_IDs[ROWS][SIZE];
    char buffer_subjects[ROWS][SIZE];
    int marks[ROWS];
    char *string_ptrs[ROWS];
    struct student db[STUDENTS];

    if((input=fopen("C:\\marks\\marks.txt", "r"))==NULL)
        perror("File open failed!");
    else
    {
        while ( ( data_items=fscanf(input, "%s %s %d", buffer_IDs[records], buffer_subjects[records], &marks[records])) == 3) {
        printf("%s %s %d\n", buffer_IDs[records], buffer_subjects[records], marks[records]);
        string_ptrs[records]=buffer_IDs[records];
        records++;
        if ( records > ROWS) {
            break;
        }
    }

    }

    qsort(string_ptrs, records, sizeof(char*), string_compare);

    for(i=0;i<records;i=i+4)
    {
        j=0;
        strcpy(db[j].student_ID,string_ptrs[i]);

        printf("%s\n",db[j].student_ID); /*Happily prints the unique IDs contained in the structure*/
        j++;
    }

    for(i=0;i<STUDENTS;i++)
        printf("%s\n",db[i].student_ID); /*Does NOT print them outside the for loop which initialises the structure. */


    return 0;
}

2 个答案:

答案 0 :(得分:8)

看起来你的第一个for循环总是只打印第一个学生ID。在循环开始时,将j设置为0,最后将其递增。但是,在循环的每个步骤之后,j再次变为0。

因此,只有第一个学生ID被“初始化”,而下一个元素都是未初始化的。

答案 1 :(得分:1)

为什么你的&#34;初始化&#34;循环在每次迭代时跳过4个字符串指针

for(i=0;i<records;i=i+4)
  ...

此循环将仅初始化records / 4数组中的db个元素。即j的最终值将告诉您db中有多少元素具有有意义的student_ID值。 (而且只有1,因为正如Alef在他的回答中所指出的那样,你在'#34;初始化&#34;周期'的每次迭代中重置j的值。

稍后您打印STUDENTS个元素。 STUDENTS j的最终值与STUDENTS无关。如果j大于db,该怎么办?预计,您将从{{1}}的未初始化元素中打印完整的垃圾。