求两个字符串的交集,看似简单,实则需要考虑的细节很多。
我的思路:
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; //返回地址
}
注意;
这个代码任然后缺陷,因为用这个代码求得两个字符串的交集永远不会出现空格。
其他思路推荐:
先在第一个字符串中确定一个字符,在第二个字符串中查找是否存在相同字符串
这条思路特要注意字符串中字符重复出现带来的影响
总结
到此这篇关于c语言求两个字符串的交集的文章就介绍到这了,更多相关c语言字符串交集内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!