Ошибка сегментации || Манипулирование строками с помощью c - PullRequest
0 голосов
/ 28 июня 2018

Может кто-нибудь, пожалуйста, проведите меня через это: когда я пытаюсь выполнить свою программу без какой-либо ошибки компиляции, я получаю ошибку ошибки сегментации при копировании символов из одной строки в другую строку. Для справки: моя программа обнаруживает наиболее часто встречающуюся подстроку указанной длины из строки

мой код выглядит следующим образом:

    #include<stdio.h>
#include<string.h>
#include<stdlib.h>
char* format(char* str,int l);
void main(){
    char *str=malloc(1024*sizeof(char));
    char *sub;
    int i;
    printf("\n Enter the string : ");
    fgets(str,1024,stdin);
    printf("\n");
    puts(str);
    printf("\nEnter max no of char for substrings:");
    scanf("%d",&i);
    sub=malloc(i*sizeof(char));
    strcpy(sub,format(str,i));
    printf("\nSubstring : %s",sub);
    free(str);
}
char* format(char* str,int l){
    int i,j,k,x,max,pos;
    int len =strlen(str);
    int *arr=(int*)malloc(len*sizeof(int));
    char **subs =(char**)malloc(len*l*sizeof(char));

    printf("\n test 1 %s %d",str,l);
    for(i=0;i<len-l;i++){
        for(j=0;j<l;j++){
            *(*(subs+i)+j)=*(str+i+j);
        }
    }
    printf("\n test 2");
    for(i=0;i<l;i++){
        for(j=0;j<i;j++){
            x=strcmp(subs[i],subs[j]);
            if(x==0){
                arr[i]=arr[j]+1;
            }
        }
    }
    printf("\n test 3");
    max=arr[0];
    for(i=0;i<l;i++){
        if(arr[i]>max){
            max=arr[1];
            pos=i;
        }
    }
    printf("\n test 4");
    return subs[i];
}

после прохождения теста 1 в формате функции () программа перестает отвечать на запросы.

 for(i=0;i<len-l;i++){
        for(j=0;j<l;j++){
            *(*(subs+i)+j)=*(str+i+j);
        }
    }

Пожалуйста, проведите меня через это, ваша помощь будет очень признательна.

Ответы [ 2 ]

0 голосов
/ 28 июня 2018

Объявить char **subs не подходит. *(*(sub + i) + j) доза не указывает на то, что вы ожидаете.

См. Пример *(*(sub + 1) + 2).

Во-первых, sub + 1

|char| ... *6 ... |char|'c'|char| ... |

^                      ^
|                      |
sub                    sub+1

В вышеприведенном случае *(sub + 1) просто равен 'c'.

Тогда *(sub + 1) + 2 просто равен 'c'+2, который является неизвестным адресом.

Наконец, *(*(sub + 1) + 2) означает доступ к содержимому с адресом 'c'+2.

Я предлагаю:

char *array = malloc(sizeof(char) * cols * rows);

// Access element at (row=i, col=j)
// Use []
array[i * cols + j] = 'c';
// Or use *()
*(array + i * cols + j) = 'c';
0 голосов
/ 28 июня 2018

sub=malloc(i*sizeof(char)); Распределяет пространство для i x char, а не i x char*.

Даже если вы получили это право (sizeof(char*)), вам все равно нужно выделить каждый элемент этого массива, чтобы было место для копирования.

... И пусть даже не запускается при утечках памяти ...

...