这是我代码的一部分。当我运行我的代码时,它请求用户的输入,然后将其与记录在我的结构中的另一个整数匹配。当用户输入匹配时,它工作正常。但是当用户输入错误的输入时,就会出现分段错误。我应该在什么地方对我的代码进行更改?
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("nt---------------------------------------n");
printf("nnPlease 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("nnStudent ID: %d, Student Name: %snn",info.id,info.name);
break;// to not take another students' informations.
}
}
flag=0;
goto LABEL;
printf("Program is terminated");
使用不需要的逗号进行循环的正确方法是这样的。找到正确的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
。
原因可能是您到达了一个在循环结束时不存在的索引,在迭代器"i"的"if"语句的那一刻。
或者在最后一个 if 中,您访问数组的"位置"索引。检查这些限制。
另外,尝试GDB,对于解决此类问题很有用。