Почему я получаю ошибку сегментации (дамп ядра) - PullRequest
0 голосов
/ 10 февраля 2020

Привет, я не знаю, почему я получаю ошибку ошибки сегментации. Я должен, учитывая указатель на файл (который содержит одно число в строке, например, 12232 в первой строке и 240 во второй и т. Д. c ..), я должен найти и напечатать для каждого числа шифр, который повторяется больше по времени в числе, в строке 12232 должно быть напечатано: «число равно 12232, а число равно 2»

void stampa(FILE *fp) {

    char m[MAX], copia[MAX], *fp_m = m;
    int rip, dim, i, j, massimo=0, valore;

    if (fp == NULL){
        printf("Puntatore a file vuoto.");
        exit(0);
    }

    while(!(feof(fp))){
        fgets(m, MAX, fp);
        fp_m = m;
        dim = strlen(m)-1;
        for (i=0; i < dim; i++){
            copia[i] = fp_m[i];
        }
        copia[i] = '\0';

        for(i=0; copia[i]!='\0'; i++){
            rip = 0;
            if (copia[i] == '*')
                i++;
            else{
                for(j=i; j < dim; j++){
                    if(fp_m[i] == copia[j]){
                        rip++;
                        copia[j] = '*';
                    }
                }
                if (rip == massimo && fp_m[i] > fp_m[valore])
                    valore = i;
                if(rip > massimo){
                    massimo = rip;
                    valore = i;
                }
            }

        }
        massimo = 0;
        printf("Il numero piu' ripetuto in %s e': %c \n", m, fp_m[valore]);
    }

    return ;
}

1 Ответ

0 голосов
/ 11 февраля 2020

Вот пара ошибок:

  1. while(!(feof(fp))){ всегда неверно .

  2. for(i=0; copia[i]!='\0'; i++){
        rip = 0;
        if (copia[i] == '*')
            i++;
    

    Когда copia[i]=='*', то i будет увеличиваться один раз в предложении if и снова в конце l oop. Это пропустит символ, следующий за *. В частности, если строка заканчивается на '*', вы пропустите завершающий нулевой байт и начнете работать с неинициализированной памятью. Скорее всего, вы просто хотели ничего не делать (или, возможно, continue;), когда copia[i]=='*'.

Добавление указателя fp_m не сделало эту ошибку лучше или хуже, но изменение макета стека, возможно, привело к тому, что l oop в конечном итоге столкнется с нулевым байтом и прекратит работу вместо сбоя. Это на самом деле плохо, потому что это заставило вас думать, что ошибка исчезла, когда ее не было. Внесение несвязанных изменений до тех пор, пока ваша программа не запустится, является крайне вредной привычкой при программировании на C.

...