У меня есть ошибка сегментации при выполнении этой программы, и все, что я знаю, это то, что 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;
}
'get' является устаревшим и опасным. Никогда не используйте его (по крайней мере, используйте 'fgets', или предпочтительно' getline', или, возможно, 'readline'). Затем скомпилируйте свой код со всеми предупреждениями и информацией об отладке ('gcc -Wall -Wextra -g'), затем ** используйте отладчик ** (' gdb') и [valgrind] (http://valgrind.org/) если доступно. –
Итак, почему бы вам не использовать отладчик, чтобы проверить, где он segfault и почему? – DarkDust
'for (i = 0; i <= kraj; i ++) {' '' <= 'является подозрительным. – wildplasser