2016-11-28 3 views
0

ポインタを使用して構造体を読み書きするコードを以下に書きました。アプリケーションはデータを印刷していますが、後でクラッシュします。どこか愚かな間違いであるようだ。正確な問題を見つけることができません。 printStructで値渡しを使用し、readStructで構造体を返そうとしました。問題はありません。ポインタを使用すると何がうまくいかないのか分かりません。アプリケーションポインタを使用して構造体を印刷するとクラッシュする

#include<stdio.h> 
#include <inttypes.h> 
#include <string.h> 

struct student{ 
    char USN[10]; 
    char name[50]; 
    char gender; 
    uint8_t age; 
}; 


void printStruct (struct student*); 
void readStruct(struct student*); 


int main() { 

    uint8_t numStudents; 
    printf("Enter number of students\n"); 
    scanf("%d",&numStudents); 
    struct student firstSemStudent[numStudents]; 
    readStruct(firstSemStudent+0); 
    printStruct(firstSemStudent+0); 
    return 0; 
} 

void printStruct (struct student *var1) 
{ 
    printf("USN= %s\n",var1->USN); 
    printf("Name = %s\n",var1->name); 
    printf("Age = %d\n",var1->age); 
    printf("Gender = %c\n",var1->gender); 
} 

void readStruct(struct student *temp) 
{ 
    printf("\nEnter USN: "); 
    fflush(stdin); 
    gets(temp->USN); 
    printf("\nEnter Name: "); 
    fflush(stdin); 
    gets(temp->name); 
    printf("\nEnter age\n"); 
    scanf("%d",&temp->age); 
    printf("\nEnter the Gender as M/F"); 
    fflush(stdin); 
    scanf("%c",&temp->gender); 
} 

答えて

1

まず、uint8_t *scanf()ため%d書式指定子のための有効な引数の型ではありません。間違ったタイプの引数を使用すると、undefined behaviorが呼び出されます。

その後、技術的に言えば、fflush(stdin);は再び、未定義の動作don't do itとなります。

第3に、バッファオーバーランの可能性があるため、DO NOT use gets(), it is dangerousです。代わりにfgets()を使用してください。

すべての問題(あるいは、コンパイラが苦情を言って叫んでいる警告メッセージ)を修正し、コードを実行します。

+0

fflush()以外の問題を修正した後で動作します。しかし、私の質問は:gets()とfflush()が動作しないのはなぜですか?どのようにそのような問題を知る必要がありますか?また、fflushを使わないとScanfも問題を引き起こします。私は本当にstdinから読むための最善の方法は混乱している?また、uint8_tのデータを読み取るにはどうすればよいですか?私はintまたはshort intに行きたくないと仮定します。 – Rajesh

+0

@Rajesh最良の方法は 'fgets()'、IMHOを使うことです。あなたの都合に合わせて、読んで、解析してください。 –

+0

unsigned charの書式指定子はどうですか?私はそこにいるとは思わない。 %cを使わずに8ビット値を読み取るにはどうすればよいですか?また、uint8_t、uint16_tなどは、アーキテクチャに依存しないため、変数を宣言する標準的な方法です。すべてのコメント! – Rajesh

関連する問題