关于 最长公共子串 的问题

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

img

#include
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"%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;i0;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;i0;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;
}

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

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 帮你找了个相似的问题, 你可以看下: https://ask.csdn.net/questions/7457296
  • 这篇博客也不错, 你可以看下计算机算法设计与分析 递归实现快速排序和随机化实现快速排序
  • 除此之外, 这篇博客: 数组名做函数参数中的 给大家写一个数组名作为函数参数吧 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    在此特别说明:
    数组名作为函数参数时,需要分别在背调函数与主调函数中说明数组类型,并且要求实参与形参的数组类型相同,维数相同。在进行参数传递时,是“地址传递”,也就是说是实参数组的起始地址传递给了形参数组,而不是将实参数组中的元素一一传递给形参数组元素。

    一维数组名作函数参数:
    一维数组做函数参数时,函数声明的语法格式:
    void disp(int a[10],int n); /* 声明数组参数的函数*/
    void disp(int a[10]); /* 数组的大小也可以省略*/
    函数调用的语法格式:
    int sco[10];
    disp(sco,10);
    下边为大家举个例子:
    在主函数中输入十个数存放在数组中,判断这个数组中的元素有几个正数?

    #include<stdio.h>
    int data(int a[10])
    {
    	int i,b=0;
    	for(i=0;i<10;i++)
    	{
    		if(a[i]>0)
    		{
    			b++;
    		}
    	}	
    	return b;
    }
    int main()
    {
    	int num[10];
    	int i,B;
    	for(i=0;i<10;i++)
    	{
    		scanf("%d",&a[i]);
    	}
    	B=data(num);
    	printf("该数组中的正数有%d个",B);
    	return 0;
    }
    

    在这里插入图片描述

  • 您还可以看一下 张飞老师的硬件开发与电路设计速成入门到精通视频教程第一部课程中的 现场教大家画门控开关的原理图小节, 巩固相关知识点

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^