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; //返回地址 }
注意;
这个代码任然后缺陷,因为用这个代码求得两个字符串的交集永远不会出现空格。
其他思路推荐:
先在第一个字符串中确定一个字符,在第二个字符串中查找是否存在相同字符串
这条思路特要注意字符串中字符重复出现带来的影响
总结
加载全部内容