细分故障||使用c进行字符串操作

时间:2018-06-28 03:26:38

标签: c segmentation-fault runtime-error

任何人都可以通过以下方式指导我: 当我尝试执行程序时没有任何编译错误时,在将字符从一个字符串复制到另一个字符串时遇到了段错误,供参考-我的程序从一个字符串中找出指定长度的最常见子字符串

我的代码如下:

    #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];
}

在函数format()中通过测试1后,程序停止响应。

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

请引导我完成此过程,非常感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

sub=malloc(i*sizeof(char));i x char而不是i x char*分配空间。

即使您拥有正确的权限(sizeof(char*),您仍然需要分配该数组的每个成员,以便有足够的空间复制到其中。

...而且甚至不让内存泄漏开始...

答案 1 :(得分:0)

声明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';