C语言(CED)多组字符串匹配,输出所有重复出现的字符串,多次重复出现的只输出一次就好。

最近遇到一道题目:多组字符串匹配,输出所有重复出现的字符串,多次重复出现的只输出一次就好。

举个例子:

input:qwer

           qwer

           sdfgh

output:qwer

题意大致就是这样,下面给出我的最终解答,因为不是OJ所以可能还会有些许错误!若有,还望各位指正!

一、解题思路

1、main()函数里:

因为涉及到多组字符串匹配,为了方便起见我是用二维数组(开的足够大,而且是有两个,一个用来存储初次输入的字符串,另一个用来保存要输出的结果,以便统一输出),存储字符串并进行比较(你可以尝试一下动态分配内存空间malloc一下)。我先输入一个数字,用来明确将要有多少串字符串进行匹配。接下来根据之前输入的数字,进行字符串的输入,输入完成后,就会跳进字符串匹配函数match()中。

2、match()字符串匹配函数

这部分函数写的很复杂->空间复杂度高,循环套循环,循环套循环,因为不是OJ所以这么任性!这个函数大体上实现两个功能1:匹配字符串,将重复出现的字符串有条件的放到str1[1000][1000]数组中

2:对已重复出现的字符串进行查重,即“1”中的存储条件,以达到单一输出的目的!

match()内部使用的函数是函数库中提供的strcmp()函数和strcpy()函数。值得注意的是,在将已查到的重复的字符串放入str1[1000][1000]数组(输出结果聚集数组)中时,有一个Flag标记,用来标明这个将要存储的字符串是否已在str1[1000][1000]数组存在。

二、实现过程

下面的程序将main()和match()函数分离,代码的注释应该是很清楚了,所以在这里就不多说了!程序中涉及到二维数组传参问题等可以参考我的其他博文!(strcmp()可以比较二维数组,但是是要按行来比较

#include<stdio.h>
#include<string.h>
char str[1000][1000]; //定义一个能存1000个字符串的大小为1000个字符的char型数组
char str1[1000][1000];//把所有找到的不重复的结果存储找到STR1中
int k=0;//str1中的字符串数量
void match(int n,char (*str)[1000])
{
    int i,p;//定义内外循环变量
    int j=0;//循环控制变量,判断找到的在str中重复出现的字符串之前是否存到了str1中。
    for(i=0; i<n-1; i++)
    {
        for(p=i+1; p<n; p++)
        {
            if(strcmp(str[i],str[p])==0)//说明str字符串组中有重复出现的字符串
            {
                if(k==0)//表示str1中还没有字符串,所以可以直接复制过去
                {
                    strcpy(str[p],str1[k]);
                    k++;
                }
                else
                {
                    int flag=0;//用于确定str中重复出现的字符串是否在str1中出现
                    for(j=0;j<k;j++)//用循环对已找出的str1中进行查重
                    {
                        if(strcmp(str[p],str1[j])==0)//如果有重复,则改变标记flag
                        {
                            flag=1;
                            break;
                        }
                        else
                        continue;
                    }//跳出循环后,对flag进行判断,如果为0说明可以将之前的结果放入str1中,若为1,则说明结果重复,进行下一次的str字符串组的搜寻
                    if(flag==0)
                    {
                        strcpy(str[p],str1[k]);
                        k++;
                    }
                    else
                    continue;
                }
            }
        }
    }
}
int main()
{
    printf("请输入要比对的字符串数量:\n");
    int n;//字符串数量
    scanf("%d",&n);//输入字符串的数量
    printf("请输入所有要比对的字符串:\n");
    for(int i=0; i<n; i++) //循环,从而输入所有要匹配的字符串。
        scanf("%s",&str[i]);
    match(n,str);//调用匹配函数
    int i=0;
    if(k!=0)//说明有结果可以输出
    {
        printf("所有重复出现的字符串为:\n");
        for(i=0;i<k;i++)
        printf("%s\n",str[i]);
    }
    else
    printf("抱歉!没有相同的字符串\n");
    return 0;
}
发布了62 篇原创文章 · 获赞 93 · 访问量 12万+

猜你喜欢

转载自blog.csdn.net/GenuineMonster/article/details/88342163