2017-10-31 16 views
-3

ここは私のコードの一部です。コードを実行すると、ユーザーからの入力を要求し、それを自分の構造体に記録されている別の整数と照合します。ユーザーの入力が一致している場合は、正しく動作しています。しかし、ユーザーが間違った入力を入力すると、セグメント化エラーが発生します。どこでコードを変更する必要がありますか?整数を比較するとC分割エラーが発生する

long int userInput,endCheck; // Input from user 
int flag=0; // check for match 
int status; 
int c; // controlling ctrl+D 
int position= 999; // position of where the user input and data matched 

LABEL: 
    printf("\n\t---------------------------------------\n"); 


    printf("\n\nPlease enter the student ID which you want to find(3-times CTRL+D for finish):\n"); 



    scanf("%d",&userInput); 

    if((c=getchar()) == EOF){ 
    exit(0); 
    } 




    for(i=0;i<lines,flag==0;i++){ 

     if(index[i].id == userInput){ 
      position=i; 
      flag=1; 
     }else{ 
      position=999; 
     } 
    } 

    if(flag==0){ 
    printf("id not found"); 
    } 


studentInfo info; // for storing the information which we will take between determined offsets 
    if(position!= 999){ 
      if ((pos = lseek(mainFile,index[position].offset , SEEK_SET)) == -1)/*going to determined offset and setting it as starting offset*/ 
     { perror("classlist"); return 4; } 


      while ((ret= read(mainFile,&info, sizeof(info))) > 0 ){ 
      printf("\n\nStudent ID: %d, Student Name: %s\n\n",info.id,info.name); 
        break;// to not take another students' informations. 
      } 

    } 
flag=0; 
goto LABEL; 


printf("Program is terminated"); 
+1

'index'とは何ですか? –

+3

segfaultはどの行にありますか?あなたが参照する「間違った入力」とは何ですか?なぜ、あなたはgotosを使用していますか?なぜGOTOを使用していますか? – nicomp

+0

インデックスは私の構造です。私の構造では学生IDがあり、それをユーザーの入力と照合しようとしています。 –

答えて

0

理由は、あなたが「i」は、イテレータと「IF」文の瞬間には、サイクルの終わりには存在しないインデックスに達しているという事実もできます。

最後のifでは、配列の「位置」インデックスにアクセスします。これらの制限を確認してください。

また、GDBを試してみると、この種の問題を解決するのに便利です。

+1

「おそらく」は答えには適していません。これは、あなたが十分な評判を持っているときに行うことができるコメントとして投稿する必要があります。 – klutt

+2

それで、私はできるだけ高い評判に達するために助けてください。私がコメントできない場合、答える代わりに何をするのですか? – samthegolden

+0

あなたが適切な答えを与えることができない場合は、可能な限り別の質問を見つけてください。私はそれが最初は少しイライラしていることを知っていますが、それはそうです。 – klutt

0

不要なコンマでループを実行する正しい方法は、次のとおりです。 index[i].idが見つかったら、breakを使用してループを早期に終了することができます。

for(i=0;i<lines;i++){ 
    if(index[i].id == userInput){ 
     position=i; 
     flag=1; 
     break; 
    } 
} 

positionは、コードの最初から999に設定されているとしてあなたは、他のブランチを必要としません。しかし、実際には、この方法でポジションを使用すべきではありません。 999以上のレコードがある場合はどうなりますか? positionを有効な値に設定しているかどうかを確認するには、既にflagを使用しています。 if(position!= 999)のインスタンスをif(flag)に置き換える必要があります。

positionは符号付きintであるため、負の値を使用してflagを削除することができます。

関連する問題