2 つの問題があります。最初の 1 つは、配列の出力で行を一致させることができないことです。一致する最初の行しか取得できません。
void printStructs(struct student *list, int size){
int j = 0;
printf("Last Name, First Name Term ID Course Section\n");
printf("-------------------------------- ---- --------- ------ -------\n");
while(j < size){
printf("%s, %-21s %-5d %-11d %s%d %7s\n", list[j].lastname, list[j].firstname, list[j].term, list[j].id, list[j].subjectname,list[j].catalog, list[j].section);
j++;
}
}
これにより、これの出力が得られます。
最初の 1 つだけが適切に並んでいるのがわかりますか? これを行うために残りの行を取得するにはどうすればよいですか!?
さて、私の 2 番目の問題は、単に見ることができないものです。姓の前の最後から 2 行目に余分な「Susan」が表示されていることに注意してください。それはどこから来ているのですか!? 他のすべての名前で機能しますが、ここに表示されていないものは何ですか?
編集: 余分な名前に関するエラーは、ここでは見つかりません! 名前をその値に初期化するループと関係があることに気付きました。わからない場合はさらに編集します。今のところ無視してください。
EDIT2「余分な文字列の問題!」:
わかりましたので、問題がどこにあるかを絞り込みましたが、それが発生した正確な理由ではありません。区切り文字と関係があると思います...ここにコードがあります
studentsRead = readStudentList(inputf, students, N);
printf("%s\n", students[6].lastname);
printStructs(students, studentsRead);
/*for (j = 1 ; j <= 10-1 ; j++){
for(k = 0 ; k <= 10-2 ; k++){
if(students[k] > students[k+1]){
temp = students[k];
students[k] = students[k+1];
students[k+1] = temp;
}
}
}*/
fclose(inputf);
return 0;
}
int readStudentList(FILE *f, struct student *list, int maxSize){
char buff[65];
int count = 0;
while((count < maxSize) && (fgets(buff, sizeof(buff), f) != NULL)){
struct student item;
if(parseStudent(&item, buff)){
list[count++] = item;
}
}
return count;
}
int parseStudent(struct student *person, char *data){
char *ptr;
int i = 0;
ptr = strtok(data, DELIM);
person[i].term = atoi(ptr);
ptr = strtok(NULL, DELIM);
person[i].id = atoi(ptr);
ptr = strtok(NULL, DELIM);
strcpy(person[i].lastname, ptr);
printf("%s\n", person[i].lastname);
ptr = strtok(NULL, DELIM);
strcpy(person[i].firstname, ptr);
ptr = strtok(NULL, DELIM);
strcpy(person[i].subjectname, ptr);
ptr = strtok(NULL, DELIM);
person[i].catalog = atoi(ptr);
ptr = strtok(NULL, DELIM);
strcpy(person[i].section, ptr);
}
このコードを実行すると、readStudentList 呼び出しの後の printf まで、すべてが正常に印刷されます。これにより、名前の文字列が最後にスタックされた状態で姓が出力されます。私の解析関数に出力されていますが、姓は正常に表示されているようですか? どこに問題があるかを確認するために、あちこちに印刷物を配置しようとしましたが、それらのいくつかは何も印刷しませんか?