2015-09-27 138 views
1

我想刪除字符串(小於或等於)的所有實例。即使重疊的子串也應該被完全刪除。 這是我所編寫的代碼:搜索並刪除字符串中的子字符串

#include<stdio.h> 

int Checknremove(char *str,char *ph) 
{ 
     while(*str) 
     { 
       char *k=ph,*s=str; 
       while(*k && *k==*s) ++k,++s; 
       if(!*k) 
       { 
         while(*s) *str++=*s++; 
         *str=0; 
         return 1; 
       } 
       ++str; 
     } 
     return 0; 
} 

int main() 
{ 
     int t; 
     scanf("%d", &t); 
     while(t--) 
     { 
       char str[100], ph[100]; 
       scanf("%s %s", str, ph); 
       while(Checknremove(str,ph)); 
       puts(str); 
     } 
     return 0; 
} 

問題是,它不僅能消除它們是不同的和不重疊的那些子串。 示例:catafjkgjcat cat 將輸出afjkgj,但aababbaababbac aababba將輸出ababbac,而不是c,因爲我想要它。我該怎麼辦?

+0

而不是刪除子字符串,你可以記住它的位置,並不斷尋找和記憶其他事件。然後,當你發現所有的事件時,你可以擦除它們,注意重疊的字符。 –

+0

'strstr()','memmove()',重複... – wildplasser

回答

1

aababbaababbac有兩個aababba,但它們重疊。

您應該首先標記要刪除的位置,然後刪除標記的字符而不是刪除您立即發現的內容。

更新:這裏是一個示例實現。

#include<stdio.h> 
#include<stdlib.h> /* for using malloc */ 
#include<string.h> /* for using strlen and strncmp */ 

/* add const since it won't be modified */ 
/* made the return value void since this will remove all target by one call */ 
void Checknremove(char *str,const char *ph) 
{ 
     size_t srclen = strlen(str); 
     size_t targetlen = strlen(ph); 
     char *delete_flag = calloc(srclen, 1); 
     size_t i, j; 
     if(delete_flag == NULL) exit(1); /* failed to allocate the memory */ 
     /* search the target and mark it */ 
     for(i = 0; i <= srclen - targetlen; i++) 
     { 
       if(strncmp(str + i, ph, targetlen) == 0) 
       { 
        for (j = 0; j < targetlen; j++) delete_flag[i + j] = 1; 
       } 
     } 
     /* copy undeleted characters to str */ 
     for (i = j = 0; i < srclen; i++) 
     { 
       if (!delete_flag[i]) str[j++] = str[i]; 
     } 
     str[j] = '\0'; 
     free(delete_flag); 
} 

int main() 
{ 
     int t; 
     scanf("%d", &t); 
     while(t--) 
     { 
       char str[100], ph[100]; 
       scanf("%s %s", str, ph); 
       Checknremove(str,ph); 
       puts(str); 
     } 
     return 0; 
} 
+0

謝謝!我應該更熟悉圖書館的功能....:P –

0

這個問題當然是「nremove」。如果您執行了刪除掃描的AS(即立即),則重疊部分將不再位於str中以匹配下一次迭代/調用。

你應該做的是將檢查與刪除分開:在執行任何刪除操作之前先執行所有檢查。你將不得不存儲字符串索引或者在兩者之間進行通信。