Segfault在c程序中

时间:2014-12-26 18:17:09

标签: c

执行此程序时出现分段错误,我所知道的是在两个获取命令之后和下一个scanf命令之后发生了段错误。我知道得到的并不是很好的命令在这里使用但是我的大学正在使用它所以...这是我的主要功能和程序使用的功能的代码,如果有人可以对我说问题我会很感激仍然存在。代码是用克罗地亚语编写的,但没有什么特别的东西在那里说,所以不要介意

我的主要节目

#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 个答案:

答案 0 :(得分:0)

首先 - 了解如何在调试器下运行此代码。然后它就会停在发生段错误的行上,这应该使问题更加明显。鉴于您正在说&#34;段错误&#34;,可以安全地假设您正在运行某些unix-variant,在这种情况下,&#34; gdb&#34;可能是你的调试器。

第二 - 由于超出了已分配内存的范围,因此可能有90%的时间是段错误。由于您的程序没有使用&#34; malloc&#34;分配任何内存,这意味着您要在其中一个数组的末尾写入。有可能,你的一个循环运行方式太多次,并访问超过数组的末尾。