我正在处理将此文件作为students.csv文件提供给我们的作业:
Boyd,An,903-04-2620,53583,54678,59414
Chen,Andrew,995-52-6987,57056,56361,60360,58819
Delgado,Chetan,992-63-3996,57056,60359,58820
Hong,Frederick,992-84-9667,61802,57058,60360,58841
Lee,Daniel,995-59-4469,61750,60189,60360,58890
Li,Garret,995-65-9809,60853,60295,60360,59363
Mangan,Janet,995-59-4760,60855,61367,59383
McCullough,Jason,995-83-8060,51909,61626,61637,60364
Ng,Joey,995-46-4586,57056,61670,61674,60364
Park,Komal,995-50-9519,61702,59420
正如您在此处所见,每行的数据是姓氏,名字,学生ID号,然后是与该标识相关的课程。我可以阅读其他所有内容,除非因为相关课程的数量可能会有所不同,最好是从0到5(作业有一个上限),我在如何识别和解析我的结构中的课程时遇到了麻烦。有人可以简单地建议一种方法来阅读它吗?
我正在使用以下代码阅读其余部分。我已经注释了一个部分,以填写阅读课程
ptr = strtok(temp, ",");
(*students)[*count_stud].last = (char*) malloc(strlen(ptr)*sizeof(char));
strcpy((*students)[*count_stud].last, ptr)
ptr = strtok(NULL, ",");
(*students)[*count_stud].first = (char*) malloc(strlen(ptr)*sizeof(char));
strcpy((*students)[*count_stud].first, ptr);
ptr = strtok(NULL, ",");
strcpy((*students)[*count_stud].ssid, ptr);
/*while(ptr = strtok(NULL, ","))
{
}*/ //end while crn strtok
(*count_stud)++;
这是我的结构,我已经找到了除crn [6]和count_classes之外的所有内容。
typedef struct
{
char* first;
char* last;
char ssid[15];
int crn[6];
int count_classes;
}Student;
我已经按如下方式声明了结构,然后适当地使用了malloc(我不使用malloc作为crn)
Student *students=NULL;
答案 0 :(得分:0)
是的,你使用strtok
走在正确的轨道上通过检查返回值strtok,您可以确定字符串的可选部分,因为前三个字段是必需的,您可以这样做
Student* s = calloc( 1, sizeof(Student) ); // allocate new student
s->last = strdup( strtok(temp, ",") ); // allocate and copy
s->first = strdup( strtok(NULL, ",") );
strcpy( s->ssid, strtok(NULL, "," ) );
因为你说最多可以有五门课程,你需要说五个长期的东西来保存你的结构中的那些,但是如果你想要六个就可以。
您需要将字符串转换为整数
char* course = NULL;
while ((course = strtok(NULL,",")) != NULL && s->count_classes < 5)
{
s->crn[s->count_classes++] = atoi( course );
}
上面的代码读取一个学生记录,我将留给你制作记录的数组(或链表)。提示:realloc()
代替calloc()
,但不要忘记初始化内容。