A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

mocha

中级黑马

  • 黑马币:50

  • 帖子:11

  • 精华:0

这题从main函数里第三个for循环开始就看不太懂了,本人理解应该是对比字符串的时候第一个字符串的长度。大概是说第一个字符串和第二个对比找出最大的公共子字符串,找到了第一个字符串再与第三个对比,如果不是第一次对比的字符串就再全部重新对比。
希望高手们略微指点下这题的思路,能写点注释感激不尽

#include <stdio.h>
#include <string.h>

#define MAX_N 20 //字符串的最大数目
#define MAX_LEN 256 //字符串的最大长度(含结束符'\0')

int N;//输入的字符串数
char str[MAX_N][MAX_LEN];//保存所有字符串
int Len[MAX_N];//保存字符串的长度

//字符串匹配,成功返回1,失败返回0
int str_match(char *s1, char *s2, int len)
{
    while(len > 0)
    {
        if(*s1 != *s2)      //如果字符不同则退出函数
            
            return 0;
        
        s1++;       //字符相同则指针后移继续对比
        
        s2++;
        
        len --;
    }
    return 1;
}

void main()
{
    int i,s,t,l;
   
    printf("请输入字符串的数目N(N<=%d):\n", MAX_N);
   
    scanf("%d",&N); //输入字符串的个数
   
    fgets(str[N], MAX_LEN, stdin);      //输入要对比的字符串的个数N
   
    printf("请输入%d个字符串(每个字符串以回车结束):\n",N);
   
    for(i=0; i<N; i++)      //创建N个字符串并记录所有字符串的长度
    {
        fgets(str, MAX_N, stdin);

        Len = strlen(str);
    }
    for(l=Len[0]; l>0; l--)
    {
        for(s=0; s+l-1 < Len[0]; s++)  
        {
            
            int flag1 = 1;      //作为对比是否成功的一个标识
            
            for(i=1; i<N; i++)  //把第一个字符串
            {
                int flag2 = 0;      //作为对比是否成功的一个标识
               
                for(t=0; t+l-1 < Len; t++)   //循环Len(i)-l+1次
                {
                    if(str_match(str[0]+s,str+t,l))  //调用函数对比字符
                    {
                        flag2 = 1;  //如有相同字符则重新赋值
                        
                        break;
                    }
                }

                if(!flag2)      //对比失败
                {
                    flag1 = 0;
                    break;
                }
            }

            if(flag1)       //对比成功
            {
                printf("最长公共子串为:\n");
                goto L;//跳到输出
            }
        }
    }
   
L: for(i=0; i<l; i++)   //输出最长公共子串
{
    printf("%c",*(str[0]+s+i));
}
    printf("\n");
}


2 个回复

倒序浏览
膜拜,这题还不简单{:3_46:}
回复 使用道具 举报
这个题解得好
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马