如何摆脱这种分割错误?

时间:2016-11-20 19:34:12

标签: c file segmentation-fault runtime-error

void search(FILE *fp){
  char lines[81];
  char iden[11];


int i = 0;
  int count = 1;
     while(!feof(fp)){
       fgets(lines,80,fp);
       // If the line dosesn't start with #, space, or tab, it has identifier
       if (lines[0] != '#' && lines[0] != ' ' && lines[0] != '\t'){
       // An identifier ends with ':'
         while (lines[i] != ':'){
           iden[i] = lines[i];
           ++i;
         }
         ins(iden, count);
       }
            ++count;
  }
}

我收到这样的错误:

p4.c:93:12:运行时错误:索引11超出类型' char [11]'

的界限

p4.c:92:17:运行时错误:索引81超出类型' char [81]'

的界限

p4.c:93:22:运行时错误:索引81超出类型' char [81]'

的界限

分段错误

注意:我的输入文件包含根据上述错误检查的数据。我的意思是每行最多80个字符,包括\ n和标识符的最大大小为10.并且行不以'#'开头。或空格或制表符在行的开头包含一个标识符,以'结尾:'最大尺寸为10,包括':#39;

在上面代码的第二个while循环中发生了什么? 为什么我会收到此错误?

p.s:我已经打开了我的文件,并在我的主方法中检查了它

1 个答案:

答案 0 :(得分:0)

您永远不会重置计数器i,也不会在标识符中添加终止符。

所以试试:

i=0;
while (lines[i] != ':'){
     iden[i] = lines[i];
     ++i;
 }
 iden[i]='\0';

但为了安全起见,你应该加以保护,所以实际使用:

while (lines[i] != ':' && i<10){

永远不要相信输入,并始终确保您的程序永远不会超过其变量的范围。