2014-12-26 2 views
-5

У меня есть ошибка сегментации при выполнении этой программы, и все, что я знаю, это то, что segfault происходит после двух команд gets и после следующей команды scanf. Я знаю, что получить не очень хорошо, чтобы использовать здесь, но мой университет использует его так ... Вот код моей основной функции и функций, которые использует программа, и я был бы признателен, если бы кто-нибудь мог сказать мне, где проблема сохраняется. Код написан на хорватском, но ничего на самом деле частности разве сказал там, так что не против того, чтоSegfault in c program

Моя главная программа

#include <stdio.h> 
#include "funkcije.h" 
#define MAX 300 

int main (void) { 
    char niz1[MAX+1], podniz[6], niz2[MAX+1]; 
    int dulj_pod = 0, kontrola, duljina1 = 0, duljina2 = 0, kraj, brojac = 0, i; 
    float slicnost; 
    printf("Ucitaj prvi niz > "); 
    gets(niz1); 
    printf("Ucitaj drugi niz > "); 
    gets(niz2); 
    while (niz1[duljina1] != '\0') 
     duljina1++; 
    while (niz2[duljina2] != '\0') 
     duljina2++; 
    printf("Ucitaj duljinu podniza : "); 
    do { 
     scanf("%d", &dulj_pod); 
    } while ((dulj_pod < 2 || dulj_pod > 5) || (dulj_pod > duljina1 || dulj_pod > duljina2)); 
    kraj = duljina1 - dulj_pod; 
    for (i=0; i<=kraj; i++) { 
     genPodniz (niz1, podniz, i, dulj_pod); 
     kontrola = sadrziPodniz (niz2, podniz); 
     if (kontrola == 1) 
      brojac++; 
    } 
    slicnost = (float)brojac/(kraj+1); 
    printf("Prvi niz : %s\nDrugi niz : %s\nDuljina podniza za usporedbu nizova : %d\n", niz1, niz2, dulj_pod); 
    printf("Slicnost nizova '%s' i '%s' iznosi %f.\n", niz1, niz2, slicnost); 
    return 0; 
}' 

И функции

#include "funkcije.h" 

void genPodniz (char *niz, char *podNiz, int pocPozicija, int duljPodniz) { 
    int i, j=0; 
    for (i=0; i<duljPodniz; i++, j++) { 
     *(podNiz+j) = *(niz+pocPozicija+i); 
    } 
    *(podNiz+j) = '\0'; 
} 

int sadrziPodniz (char *niz, char *podNiz) { 
    int kontrola, i = 0, j = 0, duljina1 = 0, duljina2 = 0, poz = 0; 
    while (*(niz+duljina1) != '\0') 
     duljina1++; 
    while (*(niz+duljina2) != '\0') 
     duljina2++; 
    while (j < duljina2) { 
     if (*(niz+i) == *(podNiz+j)) { 
      kontrola = 1; 
      i++; 
      j++; 
     } 
     else { 
      kontrola = 0; 
      j = 0; 
      ++poz; 
      i = poz; 
     } 
    } 
    return kontrola; 
} 
+1

'get' является устаревшим и опасным. Никогда не используйте его (по крайней мере, используйте 'fgets', или предпочтительно' getline', или, возможно, 'readline'). Затем скомпилируйте свой код со всеми предупреждениями и информацией об отладке ('gcc -Wall -Wextra -g'), затем ** используйте отладчик ** (' gdb') и [valgrind] (http://valgrind.org/) если доступно. –

+2

Итак, почему бы вам не использовать отладчик, чтобы проверить, где он segfault и почему? – DarkDust

+3

'for (i = 0; i <= kraj; i ++) {' '' <= 'является подозрительным. – wildplasser

ответ

0

Сначала - выяснить, как запустить этот код под отладчиком. Затем он просто остановится на линии, где происходит segfault, что должно сделать его более очевидным, в чем проблема. Учитывая, что вы говорите «segfault», вероятно, можно предположить, что вы используете какой-то unix-вариант, и в этом случае «gdb», вероятно, является вашим отладчиком.

Second - segfault, возможно, 90% времени, из-за превышения границ выделенной памяти. Поскольку ваша программа не выделяет какую-либо память с помощью «malloc», это означает, что вы пишете конец одного из ваших массивов. Скорее всего, один из ваших циклов запускает путь слишком много раз, и доступ к концу массива.

+0

Обнаружена проблема, проблема заключалась в том, что условие в функциях, чем перетаскивание некоторых других незначительных проблем , – pisacic