Ceceliaaa 2023-04-07 21:30 采纳率: 90.9%
浏览 18
已结题

关于 最长公共子串 的问题

为什么报错是分段错误呢大家

img

#include<stdio.h>
int zuichanggonggongzichuan(int n,char(*)[10000]);
int main(void)
{
    int n;
    int i,k,count;
    int T; 
    char ch[n][10000];
    
    scanf("%d",&T);
    scanf("%d",&n);
    
    for(i=0;i<T;i++)
    {
        for(k=0;k<n;k++)
        {
            scanf("%s",ch[k][10000]);
        }
        count=zuichanggonggongzichuan(n,ch[n][10000]);
        printf("%d",count);
    } 
    return 0;
}
int zuichanggonggongzichuan(int n,char ch[n][10000])
{
    int count=0;
    int jishu[10000]={0};
    int i,k;
    int m;
    //将每个字母字符串转换成数字字符串,然后一其值为索引存入一个辅助数组 
    for(i=0;i<n;i++)
    {
        for(k=0;k!='\0';k++)
        {
            ch[i][k]=ch[i][k]-'a'+10;
        }
    }
    //从第一个字符串开始以一其值为索引存入一个辅助数组 
    for(i=0;ch[0][i]!='0';i++)
    {
        m=ch[0][i];
        jishu[m]++;
        //防止重复字符 
        if(jishu[m]>1)
        jishu[m]=1;
    }
    //开始利用辅助数组开始,从第二个字符串开始,要是第二个字符串中没有辅助数组中的值,就将这个索引对应的值化为0 
    for(i=1;i<n;i++)
    {//遍历每个字符串 
        for(k=0;ch[i][k]!='0';k++)
        {
            m=ch[i][k];
            jishu[m]++;
        }
        for(m=0;m<10000;m++)
        {
            if(jishu[m]==1)
            jishu[m]=0;
            if(jishu[m]>1)
            jishu[m]=1;
        }
    }
    for(m=0;m<10000;m++)
    {
        if(jishu[m]==1)
        count++;
    }
    return count;
}

  • 写回答

2条回答 默认 最新

  • 快乐鹦鹉 2023-04-07 21:39
    关注

    第8行的时候,n值还没输入啊,这时候数组大小无法判断大小,可能无法申请足够的内存。要先输入n值后,再定义数组
    17行也不对, scanf("%s",ch[k][10000]);ch数组元素是字符,不是字符串啊。这里会崩溃。改为scanf("%s",ch[k]);
    19行改为 count=zuichanggonggongzichuan(n,ch);

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 12月22日
  • 已采纳回答 12月14日
  • 创建了问题 4月7日