2017-02-15 6 views
-1

以下、私が作業しているプログラムにフルコードを含めました。 '。'を入力するまで、ユーザーはプログラムへの入力を許可する必要があります。最初の名前の入力で。私は入力を一度行った後にセグメンテーションフォールトを取得しています。そして、構造体への入力を2回目にすると、それは私に違反します。私はまた、動的に構造体を割り当てることで、ユーザが入力を何度でも入力できるようにしますが、テストするために、プログラムを動作させるかどうかを調べるために10に設定します。ユーザー入力後のセグメンテーションフォルト

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

struct student { 
    int recordCount; 
    char *firstName; 
    char *lastName; 
    char *id; 
    char *email; 
}; 

int main() 
{ 
    struct student *aPtr; 

    aPtr = malloc(sizeof(struct student)*10); 
    //aPtr = (struct student*) malloc(10 * sizeof(struct student)); 
    aPtr->firstName = malloc(sizeof(char)*50); 
    aPtr->lastName = malloc(sizeof(char)*50); 
    aPtr->id = malloc(sizeof(char)*10); 
    aPtr->email = malloc(sizeof(char)*50); 

    int i; 
    for (i = 0; i < 10; ++i) { 
     printf("First Name: "); 
     scanf("%s", (aPtr + i)->firstName); 
     if ((aPtr + i)->firstName[0] == '.') { 
      break; 
     } 

     printf("Last Name: "); 
     scanf("%s", (aPtr + i)->lastName); 

     printf("ID#: "); 
     scanf("%s", (aPtr + i)->id); 

     printf("Email: "); 
     scanf("%s", (aPtr + i)->email); 


     printf("\n"); 
     aPtr->recordCount++; 
    } 

    for (i = 0; i < aPtr->recordCount; ++i) { 
     printf("%s, %s, %s, %s",(aPtr + i)->id, (aPtr + i)->firstName, (aPtr + i)->lastName, (aPtr + i)->email); 
     printf("\n"); 
    } 

    return 0; 
} 
+1

デバッガでプログラムを実行します。 –

+3

あなたは 'aPtr [0]'のフィールドを初期化しましたが、10個のフィールドを使用しようとしています。 – Ryan

+0

ポインタの使い方を見てください。 – Gab

答えて

0

gdbデバッガを使用してコードをデバッグすると、自分で見つけることができます。 デバッグを初めて行った場合は、このリンクをクリックして詳細を確認してください。このコードでhttps://www.tutorialspoint.com/gnu_debugger/index.htm

、私はあなたがこの行に間違ってポインタを使用していると思う:

aPtr + i)->firstName[0] == '.' 

は、ポインタの適切な使用のために調べ、それを是正します。

注:char firstname [50]、lastname [50]などを使用すると、コードをより簡単にすることができます。それを使用すると、セグメンテーションフォルトを非常に簡単に取り除くことができます。

希望すると助かります!ありがとうございました。

関連する問題