亲宝软件园·资讯

展开

c语言字符串交集

半夜偷吃雪糕 人气:0

求两个字符串的交集,看似简单,实则需要考虑的细节很多。

我的思路:

1.将两个字符串简化,将里面重复的字母减少为一个。

2.拼接两个字符串,借助循环把重复出现两次的字符找出来。

有了思路开始写代码。

一、main()函数

思路:

1.定义两个储存字符串的数组tt[M],pp[M]

2.定义指针*p接收fun2() 返回值,输出交集

3.输入两个字符串(此处注意越界问题)

4.调用函数

5.输出交集

#include <stdio.h>
#include <string.h>             //用到strcat(),strlen()函数
 
#define M 50
 
void fun1(char tt[]);           //将字符串中相同的字母去掉
char *fun2(char tt[]);          //将重复的(子集)找出来
 
 
int main()
{
    char tt[M],pp[M];           //定义两个数组,储存字符串
    char *p;                    //接受fun2()返回的地址,并输出交集字符串
    int i;
 
    gets(tt);                   //abcdef123abc12
    gets(pp);                   //acef123ace124
    fun1(tt);                   //调用函数
    fun1(pp);                           
    //printf("%s\n",tt);        //供检验使用
    //printf("%s\n",pp);    
    strcat(tt,pp);
    //printf("%s\n",tt);
    p=fun2(tt);                 //调用函数
    for(i=0;*(p+i)!='\0';i++)
    {
        printf("%c",*(p+i));    //acef123
    }
 
    return 0;
}

二、fun1()函数

fun1()作用是将字符串中重复的字符只保留一个

思路:

1.先将重复出现的字符出去第一次出现那个都换成' '(此处为一个空格)

2.在将字符串数组元素移动,去除' '(空格)

void fun1(char tt[])            //将重复的字符抹掉
{
    int i,j;
    char ch;
 
    for(i=0;i<M;i++)            
    {
        if(tt[i]!=' ')          //确保确定的这一项不是空格
        {
            ch=tt[i];           //确定第一次出现的字符
            for(j=i+1;j<M;j++)  //在他后方寻找
            {
                if(ch==tt[j])   //遇到一样的
                tt[j]=' ';      //用' '替换
            }
        }
    }
    for(i=0;i<strlen(tt);i++)
    {
        if(tt[i]==' ')                  //找到' '位置
        {                               
            for(j=i;j<strlen(tt)-1;j++) //去除' '
            tt[j]=tt[j+1];              
            tt[j]='\0';                 //此时最后一项与倒数第二项相同,用'\0'彻底抹除左后一                        
                                        //项(目的是去除' '字符串缩短)
            i--;
        }                               //防止连续出现多个' '(假如没有i--,此时tt[i]仍然为'             
                                        //'运行下一步为i++,这个空格就被保留下来了)
    }
}

三、fun2()函数 

fun2()将重复出现的字符挑出来

思路:

1.找到相同字符,并储存在static aa[M]中(小重点)

2.返回第一个字符的地址

char *fun2(char tt[])           //确定子集字符串,返回字符串第一个字符的地址
{
    int i,j,k;
    char ch;
    static char aa[M];          //静态变量,保证调用函数结束后数组还在
    char *p;
 
    k=0;
 
    for(i=0;i<strlen(tt);i++)
    {
        ch=tt[i];                       //确定第一次出现的字符
        for(j=i+1;j<strlen(tt);j++)
        {
            if(ch==tt[j])               //如果再次出现一个相同的字符将他赋值给aa[M]数组
            {
                aa[k]=ch;
                k++;
            }
        }
    }
    aa[k]='\0';                         //最后加上'\0'一来这是个字符串,二来main()函数中作为                 
                                        //for循环结束条件
    p=&aa[0];                           //确定第一个字符的地址
 
    return p;                           //返回地址
}

注意;

这个代码任然后缺陷,因为用这个代码求得两个字符串的交集永远不会出现空格。

其他思路推荐:

先在第一个字符串中确定一个字符,在第二个字符串中查找是否存在相同字符串

这条思路特要注意字符串中字符重复出现带来的影响

总结

加载全部内容

相关教程
猜你喜欢
用户评论