2016-12-16 24 views
0

structを取得する際に問題が発生しましたpointerは、ユーザプログラムの入力をfgetsでCプログラムの関数内に取り込みます。私は何が間違っているのか分かりません。 getInput()関数は、クラッシュが発生している場所です。私は、最初の名前は、その後も、最初の行との間にfgets内で構造体ポインタがクラッシュする

fgets(*stu->name, N_LENGTH, stdin); 

プログラムがクラッシュして、ユーザからの入力を取得

*stu->name = (char*)malloc(N_LENGTH); 

に保存されようとしている場所にメモリを割り当てるしようとしています二行目。

申し訳ありませんが、私はサイト上で初めてのので、ルールを破っています。

コード:

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

#define UNIT 100 
#define HOUSE 1000 
#define THRESH 12 
#define DISCOUNT 10 
#define NUM_PERSONS 5 
#define N_LENGTH 30 


struct student 
{ 
    char *name; 
    char campus; 
    int userUnit; 
}; 

void getInput(struct student *stu); 
int amountCalc(struct student *stu); 
void printOutput(struct student stu, int total); 

int main() 
{ 
    int total[NUM_PERSONS]; 
    int averageTotal=0; 
    struct student tempStudent; 
    struct student students[NUM_PERSONS]; 
    struct student *sPtr = &tempStudent; 
    int i; 
    for (i=0; i < NUM_PERSONS; i++) 
    { 
     getInput(sPtr); 
     students[i]=tempStudent; 
     total[i]=amountCalc(sPtr); 
     averageTotal+=total[i]; 
    }; 

    for (i=0; i < NUM_PERSONS; i++) 
    { 
     printOutput(students[i], total[i]); 
    }; 

    printf("\nThe average tuition cost for these %d students is $%.2f.\n", 
      NUM_PERSONS, averageTotal/(NUM_PERSONS*1.0)); 
    return 0; 
} 

void getInput(struct student *stu) 
{ 
     fflush(stdin); 
     printf("Enter student name: "); 
     *stu->name = (char*)malloc(N_LENGTH); 
     fgets(*stu->name, N_LENGTH, stdin); 

     printf("Enter y if student lives on campus, n otherwise: "); 
     scanf(" %s", &stu->campus); 

     printf("Enter current unit count: "); 
     scanf(" %d", &stu->userUnit); 

     printf("\n"); 
} 

int amountCalc(struct student *stu) 
{ 
     int total; 
     total=(stu->userUnit)*UNIT; 

     if (stu->userUnit>THRESH) { 
      total-=((stu->userUnit)-12)*DISCOUNT; 
     }; 

     if (stu->campus=='y') { 
      total+=HOUSE; 
     }; 
     return total; 
} 

void printOutput(struct student stu, int total) 
{ 
    printf("\nStudent name: %s\n", stu.name); 
    printf("Amount due: $%d\n\n", total); 
} 
+1

'* stu-> name' - >' stu-> name'です。 –

+1

コンパイラの警告を無視しないでください。 –

答えて

0

あなたの割り当てが間違っています。本当の割り当てはこのようなものです。

void getInput(struct student *stu) 
{ 
    fflush(stdin); 
    printf("Enter student name: "); 
    stu->name = (char*)malloc(N_LENGTH); 
    fgets(stu->name, N_LENGTH, stdin); 

    printf("Enter y if student lives on campus, n otherwise: "); 
    scanf(" %s", &stu->campus); 

    printf("Enter current unit count: "); 
    scanf(" %d", &stu->userUnit); 

    printf("\n"); 
} 

コンパイルすると、警告として表示されます。すべての警告を処理する必要があります。 mallocを(char *)にキャストすることも不要です。

-1

fflush(stdin)を使用しないでください。 See this question.エラーが発生するかどうかわかりませんが、C標準では定義されていないので、プラットフォームによっては処理できません。

間違ったメモリの割り当ても問題です。@HakkıIşıkの答えを見てください。

関連する問題