填写学生成绩的麻烦

时间:2014-08-10 14:03:31

标签: c

这是为了回应我前几天发布的类似威胁,将文件读入必要的数据结构,文件数据是这样的,我不记得是谁说了但是有四个主题。 (我想发布对所有回复的总体回复,但只能评论每个帖子):

131782数学59

075160数学92

580313物理63

073241数学32

487476数学73

075160物理98

472832英语44

...

我现在正在使用fscanf()来解析数据,这是一种更好的方法。我昨天做了一个关于删除重复字符串的线程。我现在已经废弃了这个想法,只是在学生ID上使用qsort并创建了一个跳过每四个元素的for循环,并将唯一的学生ID敲响到结构中。我之前做了一个printf()命令,并且它们已成功存储。现在我已经存储了ID,现在我已经准备好搜索该ID并填充它们的标记,我“想”它几乎就在那里,除了update_student()函数中的一个小问题。

如果你查看我的代码,或者甚至编译它,它不喜欢应该为学生填充标记的行,student_data [idx] .marks [buffer_subjects] =标记。但是buffer_subjects是一个字符串,但是如果你看看我的定义,那些字符串就是常量,当它到达这个阶段时就是整个想法。

我该如何解决这个问题?

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

#define STUDENTS 20

#define COMPUTING 0
#define ENGLISH 1
#define MATHEMATICS 2
#define PHYSICS 3
#define SUBJECTS 4


#define ROWS 80
#define SIZE 100

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

struct student
{
    char student_ID[SIZE];
    int marks[SUBJECTS];
};struct student student_data[STUDENTS];

int find_student(char buffer_IDs[])
{
    int j;

    for(j=0;j<STUDENTS;j++)
        if(strcmp(student_data[j].student_ID,buffer_IDs)==0)
            return j;
}

void update_student(char buffer_IDs[], char buffer_subjects[], int marks[])
{    
    int idx = find_student(buffer_IDs); 


    student_data[idx].marks[buffer_subjects] = marks;
}


int main(void)
{
    FILE *input;
    int i,j, data_items;
    char buffer_IDs[ROWS][SIZE];
    char buffer_subject[ROWS][SIZE];
    int marks[ROWS][SIZE];
    char *string_ptrs[ROWS];



    if((input=fopen("C:\\marks\\marks.txt","r"))==NULL)
        perror("File open failed!");
    else
    {
        for(i=0;i<ROWS;i++)           
        {                
            while((data_items=fscanf(input, "%s %s %d", buffer_IDs[i], buffer_subject[i], marks[i])!=3));
            printf("%s %s %d\n", buffer_IDs[i], buffer_subject[i], *marks[i]);


            string_ptrs[i]=buffer_IDs[i];
        }

        putchar('\n');

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

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

            printf("%s\n",student_data[j].student_ID); 
            j++;
        }

        for(i=0;i<ROWS;i++)
            update_student(buffer_IDs[i], buffer_subject[i], marks[i]);



    }
    return 0;
}

> Blockquote

1 个答案:

答案 0 :(得分:0)

这段代码中有很多失败。我会认真地建议逐块构建它,并使用调试器确认每个阶段的数据是否符合预期,并且不会继续执行,直到每个较低级别的块工作(并且不会产生编译错误)。

通过GDB运行一些示例数据表明即使在读取和解析磁盘上文件的数据时也存在问题。

我们可以通过这种方法帮助解决个别问题。