2017-01-04 14 views
0

ファイル内の特定の生徒を検索し、その平均を計算するコードを作成しています。 1つのこと以外はすべて動作します。 char型の変数に学生の名前は、ファイル内に彼のために検索する場合はI入力、コンパイラは構造体のchar配列とユーザー入力文字配列の比較

} ...それはファイルの構造体のcharに等しい

#include <stdio.h> 
#include <stdlib.h> 

#define nl printf("\n") 
#define N 100 

struct student { 
    char id[N][N]; 
    int vote[10][10]; 
}; 

int main() 
{ 
struct student stud; 
FILE *filer; 
int i=0, j=0, k=0, n_stud=0; 
char checker[1], who[N]; 
float avg[10], mark=0.0, count=0.0; 

printf("Introduce student id: "); 
scanf("%14s", &who); 
printf("Searching for student %s...\n", who); 
nl; 

filer=fopen("students.dat", "r"); 
if(filer==NULL) { 
    printf("Can't open file...\n"); 
} 

for(i=0; fscanf(filer, "%s", &stud.id[i])!=NULL && fscanf(filer, "%c", &checker)!=EOF; ++i) { 
    for(j=0; fscanf(filer, " %d", &stud.vote[i][j])!=-1; ++j) { 
     if(stud.vote[i][j]!=-1) { 
     mark=mark+stud.vote[i][j]; 
     count++; 
     } else { 
      for(k=j; k<10; k++) { 
       stud.vote[i][k]=0; 
      } 
      break; 
     } 
    } 
    n_stud++; 
    avg[i]=mark/count; 
    mark=0.0; count=0.0; 
} 

for(i=0; i<n_stud; ++i){ 
    if (who == stud.id[i]) { //HERE IS THE PROBLEM!!! 
     printf("Student %s's average is: %.2f", stud.id, avg[i]); 
    } 
} 
nl; 

fclose(filer); 
return EXIT_SUCCESS; 

を得ることはありません

ファイル

s11111 30 28 18 -1 
sa44er44 23 18 30 18 29 18 29 -1 
s33333 30 30 -1 
22222idx 18 -1 
+0

'char'変数は名前を保持できません。 Cの文字列を格納する配列が必要です。 – Olaf

答えて

0

あなたが==演算子はを使用して(実際には単なるchar -arraysある)C- "文字列" を比較することはできません。

if(who==stud.id[i]){ 

利用代わりstrcmp() function

if (strcmp(who, stud.id[i]) == 0) { 

無関係が、それでも重要:あなたはユーザーオーバーフローwhoをさせないように確認します。あなたはこのようなwhoscanf()サイズを伝えることで、これを行うことができ

scanf("%14s", who); /* Tell it one less to have a spare char 
         to store the '0'-terminator. */ 

scanf(()は通常、引数としてアドレスを期待したがために、あなたは、whoのアドレスを渡すが、ちょうどwhoません。関数に渡されるとき、配列( `who^is ')は最初の要素のアドレスに崩壊します。

+0

ありがとうございました...私はとても疲れています。私はそれを完全に忘れていました...今すぐ試してみてください。 –

+0

すべてが機能しました。ありがとうございました:) 例では、「学生」の数人だけのファイルを使用しましたが、実際には、学生の数と名前のサイズが不明であると、演習では言います。私はちょうどカップルと試みるbeginigにサイズ15を置く。しかし、提案してくれてありがとう、私もそれを使用します –