C语言(CED)多组字符串匹配,输出所有重复出现的字符串,多次重复出现的只输出一次就好。
最近遇到一道題目:多組字符串匹配,輸出所有重復(fù)出現(xiàn)的字符串,多次重復(fù)出現(xiàn)的只輸出一次就好。
舉個(gè)例子:
input:qwer
? ? ? ? ? ?qwer
? ? ? ? ? ?sdfgh
output:qwer
題意大致就是這樣,下面給出我的最終解答,因?yàn)椴皇荗J所以可能還會(huì)有些許錯(cuò)誤!若有,還望各位指正!
一、解題思路
1、main()函數(shù)里:
因?yàn)樯婕暗蕉嘟M字符串匹配,為了方便起見我是用二維數(shù)組(開的足夠大,而且是有兩個(gè),一個(gè)用來(lái)存儲(chǔ)初次輸入的字符串,另一個(gè)用來(lái)保存要輸出的結(jié)果,以便統(tǒng)一輸出),存儲(chǔ)字符串并進(jìn)行比較(你可以嘗試一下動(dòng)態(tài)分配內(nèi)存空間malloc一下)。我先輸入一個(gè)數(shù)字,用來(lái)明確將要有多少串字符串進(jìn)行匹配。接下來(lái)根據(jù)之前輸入的數(shù)字,進(jìn)行字符串的輸入,輸入完成后,就會(huì)跳進(jìn)字符串匹配函數(shù)match()中。
2、match()字符串匹配函數(shù)
這部分函數(shù)寫的很復(fù)雜->空間復(fù)雜度高,循環(huán)套循環(huán),循環(huán)套循環(huán),因?yàn)椴皇荗J所以這么任性!這個(gè)函數(shù)大體上實(shí)現(xiàn)兩個(gè)功能1:匹配字符串,將重復(fù)出現(xiàn)的字符串有條件的放到str1[1000][1000]數(shù)組中
2:對(duì)已重復(fù)出現(xiàn)的字符串進(jìn)行查重,即“1”中的存儲(chǔ)條件,以達(dá)到單一輸出的目的!
match()內(nèi)部使用的函數(shù)是函數(shù)庫(kù)中提供的strcmp()函數(shù)和strcpy()函數(shù)。值得注意的是,在將已查到的重復(fù)的字符串放入str1[1000][1000]數(shù)組(輸出結(jié)果聚集數(shù)組)中時(shí),有一個(gè)Flag標(biāo)記,用來(lái)標(biāo)明這個(gè)將要存儲(chǔ)的字符串是否已在str1[1000][1000]數(shù)組存在。
二、實(shí)現(xiàn)過(guò)程
下面的程序?qū)ain()和match()函數(shù)分離,代碼的注釋應(yīng)該是很清楚了,所以在這里就不多說(shuō)了!程序中涉及到二維數(shù)組傳參問(wèn)題等可以參考我的其他博文!(strcmp()可以比較二維數(shù)組,但是是要按行來(lái)比較)
#include<stdio.h> #include<string.h> char str[1000][1000]; //定義一個(gè)能存1000個(gè)字符串的大小為1000個(gè)字符的char型數(shù)組 char str1[1000][1000];//把所有找到的不重復(fù)的結(jié)果存儲(chǔ)找到STR1中 int k=0;//str1中的字符串?dāng)?shù)量 void match(int n,char (*str)[1000]) {int i,p;//定義內(nèi)外循環(huán)變量int j=0;//循環(huán)控制變量,判斷找到的在str中重復(fù)出現(xiàn)的字符串之前是否存到了str1中。for(i=0; i<n-1; i++){for(p=i+1; p<n; p++){if(strcmp(str[i],str[p])==0)//說(shuō)明str字符串組中有重復(fù)出現(xiàn)的字符串{if(k==0)//表示str1中還沒有字符串,所以可以直接復(fù)制過(guò)去{strcpy(str[p],str1[k]);k++;}else{int flag=0;//用于確定str中重復(fù)出現(xiàn)的字符串是否在str1中出現(xiàn)for(j=0;j<k;j++)//用循環(huán)對(duì)已找出的str1中進(jìn)行查重{if(strcmp(str[p],str1[j])==0)//如果有重復(fù),則改變標(biāo)記flag{flag=1;break;}elsecontinue;}//跳出循環(huán)后,對(duì)flag進(jìn)行判斷,如果為0說(shuō)明可以將之前的結(jié)果放入str1中,若為1,則說(shuō)明結(jié)果重復(fù),進(jìn)行下一次的str字符串組的搜尋if(flag==0){strcpy(str[p],str1[k]);k++;}elsecontinue;}}}} } int main() {printf("請(qǐng)輸入要比對(duì)的字符串?dāng)?shù)量:\n");int n;//字符串?dāng)?shù)量scanf("%d",&n);//輸入字符串的數(shù)量printf("請(qǐng)輸入所有要比對(duì)的字符串:\n");for(int i=0; i<n; i++) //循環(huán),從而輸入所有要匹配的字符串。scanf("%s",&str[i]);match(n,str);//調(diào)用匹配函數(shù)int i=0;if(k!=0)//說(shuō)明有結(jié)果可以輸出{printf("所有重復(fù)出現(xiàn)的字符串為:\n");for(i=0;i<k;i++)printf("%s\n",str[i]);}elseprintf("抱歉!沒有相同的字符串\n");return 0; }?
總結(jié)
以上是生活随笔為你收集整理的C语言(CED)多组字符串匹配,输出所有重复出现的字符串,多次重复出现的只输出一次就好。的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 在java继承机制中 父类中的私有_Ja
- 下一篇: EdgeGallery:聚焦 5 大行业