2016-11-20 6 views
0
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 из оценок для типа 'символ [11]

p4.c: 92 : 17: ошибка во время выполнения: индекс 81 из оценок для типа 'символ [81]'

p4.c: 93: 22: ошибка: индекс 81 из оценок для типа 'символ [81]'

Ошибка сегментации

Примечание: Мой входной файл содержит данные в соответствии с вышеописанными ошибками. Я имею в виду, что каждая строка не более 80 символов, включая \ n, а максимальный размер идентификатора - 10. И строки, которые не начинаются с «#» или пробела или вкладки, содержат идентификатор в начале строки, который заканчивается символом ' : 'с максимальным размером 10, включая': '

Это происходит во втором цикле по вышеуказанному коду? Почему я получаю эту ошибку?

p.s: Я уже открыл файл и проверил его в мой основной метод

+0

'while (! Feof (fp)) { fgets (lines, 80, fp);' feof() всегда ошибочен http://stackoverflow.com/q/5431941/905902 – wildplasser

+0

Итак, как это исправить? –

+0

удалите feof() и вместо этого используйте возвращаемое значение из fgets(). – wildplasser

ответ

0

Вы никогда не сбросить счетчик i и не добавлять терминатор к идентификатору.

Так попробуйте:

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

Но для безопасности вы должны поставить в защиту так на самом деле использовать:

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

Никогда не доверяйте вход и всегда убедитесь, что ваша программа никогда не будет превышать пределы своих переменных.

Смежные вопросы