2016-08-30 22 views
0

この構造体を格納するために作成したが、合計を計算するとガベージ値が得られる。私は何度もそれを経験したが、間違いを見つけられなかった。合計を初期化しますが、答えが必要になることはありませんでした。合計を計算するたびに、以前と同じガベージ値が返されます。Cで構造体の配列を含む関数

#include <stdio.h> 
#include <stdlib.h> 
typedef struct 
{ 
    char name[50]; 
    int Assignment[5]; 
    int Test[2]; 
    int Endsem; 
    int Total; 



}student; 
void read(student s[],int n) 
{ 
    int i,j; 
    for(i=0;i<n;i++) 
    { 
     printf("Enter the name of the student"); 
     scanf("%s",&(s[i].name)); 
     printf("Enter the assignment marks \n "); 
     for(j=0;j<5;j++) 
     { 
      scanf("%d",&(s[i].Assignment[j])); 
     } 
     printf("\n Enter the Test marks \n "); 
     for(j=0;j<2;j++) 
     { 
      scanf("%d",&(s[i].Test[j])); 
     } 
     printf("\n Enter the EndSem marks \n"); 
     scanf("%d",&(s[i].Endsem)); 
     printf("\n \n "); 
    } 
} 
void compute(student s[],int n) 
{ 
    int i,j,d=0,m=0; 

    for(i=0;i<n;i++) 
    { 
     s[i].Total=0; 
     for(j=0;j<5;j++) 
     { 
      d+=(s[i].Assignment[j]); 
     } 
     for(j=0;j<2;j++) 
     { 
      m+=(s[i].Test); 
     } 
     s[i].Total=(d+m+(s[i].Endsem)); 
     printf("\n The total is %d out of 100",(s[i].Total)); 
    } 
} 
void display(student s[],int n) 
{ 
    int i,j; 
    for(i=0;i<n;i++) 
    { 
     printf("The entries are"); 
     printf("%s",(s[i].name)); 
     printf("assignment marks \n "); 
     for(j=0;j<5;j++) 
     { 
      printf(" \n %d",(s[i].Assignment[j])); 
     } 
     printf("\nTest marks \n "); 
     for(j=0;j<2;j++) 
     { 
      printf("%d \n ",(s[i].Test[j])); 
     } 
     printf("\n EndSem marks \n"); 
     printf("%d \n",(s[i].Endsem)); 
    } 
} 
void main() 
{ 
    student s[1]; 

    read(s,1); 
    display(s,1); 
    compute(s,1); 
} 

これを解決するにはどうすればよいですか?

+0

あなたは* before *を表示するので計算しますか?つまり、初期化されていない*変数の値を出力し、その値は* indeterminate *になり、*未定義の動作*になります。 –

+1

ようこそスタックオーバーフロー。あなたはあなたの質問を改善することができます。 [最小、完全、および検証可能な例](http://stackoverflow.com/help/mcve)をお読みください。あなたのコードが何も特別な問題であなたの正確な問題を示すとき、あなたはボランティアしてあなたを助ける人たちに敬意を表しています。 – zhon

+1

サイドノート: 'scanf("%s "、&(s [i] .name));' - > 'scanf("%49s "、s [i] .name);' –

答えて

1

問題が

m+=(s[i].Test); 

Testである、配列ではなく、通常の(スカラー)変数です。それは、配列の最初の要素の開始アドレスを指し示す(またはその位置が崩れる)。 intにそれを追加することは意味がありませんここに。あなたは、私はすでにコメントとして、あなたがのためにscanf("%49s",...)のように、バッファoverfloeを防ぐために、最大フィールド幅を含む

  • ためscanf()文を書き換えなければならない、と述べた

    m+=(s[i].Test[j]); 
    

    を書きたいかもしれません

    配列のサイズの引数である

  • は、がのようにcharへのポインタ配列を期待するため、配列のアドレスではなく配列名を渡します
関連する問題