C - 比较整数时的分段错误

时间:2017-10-31 09:52:10

标签: c segmentation-fault

这是我的代码的一部分。当我运行我的代码时,它要求用户输入,然后将其与我的结构中记录的另一个整数相匹配。当用户输入匹配时,它正常工作。但是当用户输入错误的输入时,会出现分段错误。在哪里,我应该对我的代码进行更改?

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");

2 个答案:

答案 0 :(得分:0)

原因可能是您在迭代器“i”的“if”语句中到达循环结束时不存在的索引。

或者在最后一个if中,您访问数组的“position”索引。检查这些限制。

另外,尝试dynamically load对解决此类问题非常有用。

答案 1 :(得分:0)

使用不需要的逗号进行循环的正确方法是这样的。当您找到正确的index[i].id时,您可以使用break提前退出循环。

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

您不需要else分支,因为position从代码开头设置为999。但实际上你不应该以这种方式使用职位。如果您有超过999条记录怎么办?您已经使用flag来确定您是否已将position设置为有效值。您应该将if(position!= 999)的任何实例替换为if(flag)

或者由于position是签名的int,您可以使用否定值并放弃flag