1

ループを使用して「names」「e1」「e2」「e3」「e4」「avg」および「grade」の小さなグラフを表示する関数を作成します。関数では、「names」配列に格納されている要素を印刷するのに問題があります。

これは関数全体です。

void display(stuff *everything)
{    
int q = 0;

printf("\n\n Name \t\t E1 \t E2 \t E3 \t E4 \t Avg \t Grade");
for(q=0; q<13; q++)
{
printf("\n %s \t %d \t %d \t %d \t %d \t %.2f \t %c",
everything[q].names[q],
everything[q].scores[0],
everything[q].scores[1],
everything[q].scores[2],
everything[q].scores[3],
everything[q].average,
everything[q].letter);
}
return;
}

すべてはこれからです:

typedef struct structure
{
char names[20];
int scores[4];
float average;
char letter;
} stuff;

メインに入ったら。

stuff everything[13];
int i=0;
int j=0;
int a=0;
FILE *student, *score;
student = fopen("student.dat", "r");
score = fopen("scores.dat", "r");

名前は次のように入力されます。

for(a=0; a<13; a++)
{
 fscanf(student, "%s", &everything[a].names[a]);
}
fclose(student);

そして、これは関数呼び出しです:

display(everything);

コンパイルは問題なく実行できますが、実行するとセグメンテーション エラーが発生します。いくつかのテストの後、多かれ少なかれ、関数内の %s に由来することがわかりましたが、修正方法がわかりません。ヘルプ?

4

2 に答える 2

3

読み取りコードを次のように変更する必要があります。

for(a=0; a<13; a++)
{
    fscanf(student, "%19s", everything[a].names);
}
fclose(student);

「names」は文字配列です。ひもを収納できます。scanf を呼び出すときは、アンパサンドを使用する必要はありません。これは、配列が関数に渡されるときにポインターに "減衰" するためです。添え字の [a] を追加するのも間違いでした。印刷についても同様です。

これとは別に、scanf のフォーマット文字列に注意してください。20 文字のバッファのオーバーフローを避けるために 19 を追加しました (null 終了には余分な文字が必要です)。

于 2013-04-30T00:47:59.413 に答える
0

everything[q].names[q]これは、文字列のth 文字の値が指す文字列ではなく、文字列 (文字列のアドレスが必要)everything[q].namesを書き込むことが目的であるためです。printf()namesq

于 2013-04-30T00:48:12.197 に答える