【问题标题】:C - segmentation fault when comparing integersC - 比较整数时出现分段错误
【发布时间】:2017-10-31 09:52:10
【问题描述】:

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

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

【问题讨论】:

  • 什么是index
  • 哪一行有段错误?您指的“错误输入”是什么?你为什么使用goto?为什么要使用 GOTO?
  • 索引是我的结构。在我的结构中,我有一个学生 ID,我正在尝试将其与用户的输入相匹配。
  • 什么是导致段错误的输入,记录的信息是什么?
  • 当您使用 gotos 提交格式不佳的代码时,请告诉我您的成绩。我真的很想知道你的老师有多好。

标签: c segmentation-fault


【解决方案1】:

使用不需要的逗号进行循环的正确方法是这样的。当您找到正确的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

【讨论】:

    【解决方案2】:

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

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

    另外,试试GDB,对于解决这类问题很有用。

    【讨论】:

    • “可能”不适合作为答案。这应该作为评论发布,当您有足够的声誉时可以这样做。
    • 所以,为了获得更高的声誉,我应该尽我所能提供帮助。如果我无法发表评论,我该怎么做而不是回答?
    • 如果你不能给出正确的答案,那么在你能找到的地方寻找另一个问题。我知道一开始有点沮丧,但就是这样。
    • @kutt 我不认为有人可以绝对肯定地回答这个问题,因为问题不完整。我说“可能”不是因为我是菜鸟,而是因为我不是魔术师,无法知道代码中实际发生了什么
    • 该问题已被标记,可能会被删除。如果这个问题无法回答,那很容易。不要回答它。当您需要澄清时,您可以使用 cmets。但没有足够的声誉绝不是发表评论作为答案的借口。不要误会我的意思。我自己一开始就犯了这个错误,这是可以理解的。此外,我不是负责人。我只是告诉你,如果你这样做,人们会反对并标记你。所以找到你有能力回答的问题,然后回答它们。这是我能给出的唯一建议。
    猜你喜欢
    • 2014-10-23
    • 1970-01-01
    • 1970-01-01
    • 2022-11-18
    • 2018-09-03
    • 1970-01-01
    • 2021-01-22
    • 2020-01-21
    • 2016-01-21
    相关资源
    最近更新 更多