c語言求兩個字符串的交集
求兩個字符串的交集,看似簡單,實則需要考慮的細節很多。
我的思路:
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語言字符串交集內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!