1

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 まで、すべてが正常に印刷されます。これにより、名前の文字列が最後にスタックされた状態で姓が出力されます。私の解析関数に出力されていますが、姓は正常に表示されているようですか? どこに問題があるかを確認するために、あちこちに印刷物を配置しようとしましたが、それらのいくつかは何も印刷しませんか?

4

3 に答える 3

4

%s問題は、幅を指定する代わりに姓を印刷する場所です。つまり、名の長さに応じて、行の残りの部分が左または右にシフトされます。

これをどのようにフォーマットする必要があるかについては、最初に姓と名を連結し、結果を固定幅で出力することから始めたいと思うでしょう:

char buffer[256];

sprintf(buffer, "%s, %s", list[j].lastname, list[j].firstname);

printf("%-32s ...", buffer, ...);

私の推測では、重複した名前の問題は、データを誤って読み取ったことが原因であると考えられます。あなたが示したコードにはないようです。

于 2013-03-02T04:27:28.097 に答える
1

printf ("%d %.s ", 数値, SIZE, 文字); 注: 幅 (フィールドの最小幅) と精度 (印刷される最大文字数を指定) には違いがあります。%s は幅を指定し、%.s は精度を指定します。(また、% を使用することもできます。ただし、2 つのパラメーターが必要です。1 つは幅用で、もう 1 つは精度用です)。

ここに画像の説明を入力

于 2013-03-02T04:44:59.667 に答える
1

問題は%sofprintfにあります。 and には単一の書式指定子を使用する必要がlast nameありfirst nameます。そのためconcatenate last namefirst name別のバッファーで、そのバッファーを で使用しましたprintf

于 2013-03-02T04:48:02.617 に答える