刪除字串中特定的子串
阿新 • • 發佈:2019-02-18
注意:*str++中,*和++同級,但是從左往右操作,i=*str++ 相當於 i=*(str++),又相當於 i=*str; str++;這一點可以從strcpy函式原型裡可以看出來,見:http://blog.csdn.net/zzwdkxx/article/details/8693315//********************************************************************************* //【功能】在給定字串中查詢所有特定子串並刪除,如果沒有找到相應子串,則不作任何操作。 //【輸入】 str:輸入的被操作字串 // sub_str:需要查詢並刪除的特定子字串 //【輸出】 result_str:在str字串中刪除所有sub_str子字串後的結果 //【返回】 刪除的子字串的個數 //【示例】輸入:str = "abcde123abcd123" sub_str = "123" // 輸出:result_str = "abcdeabcd" // 返回:2 //******************************************************************************** #include <iostream> #include <stdlib.h> #include <stdio.h> #include <string.h> int delete_sub_str(const char *str, const char *sub_str, char *result_str) { int i=0,num=0; int sub_str_len=strlen(sub_str); const char *temp; const char *p,*p1; char *q; p=str; p1=sub_str; q=result_str; while(*str) { if(*str==*sub_str) { temp=str; //剛開始寫成了while((*str++)==(*sub_str++)&&(*sub_str)),這樣就出了問題,二者的不通過在於++之後判斷*sub_str為空還是++之前 while((*sub_str)&&(*str++)==(*sub_str++)) i++; if(i==sub_str_len) num++; else for(int j=0;j<i;j++) { *q++=*(temp+j); } sub_str=p1; i=0; } else *q++=*str++; } printf("%s\n",result_str); return num; } int main() { char *a="a123bc123de123abc123d123"; char *b="123"; char c[100]={0}; int i=delete_sub_str(a, b,c); printf("Total %d stings was deleted!\n",i); system("pause"); return 0; }
下面是一個新的思路:
//********************************************************************************* //【功能】在給定字串中查詢所有特定子串並刪除,如果沒有找到相應子串,則不作任何操作。 //【思路】將不是子串的字元拷貝。 //******************************************************************************** #include <iostream> #include <stdlib.h> #include <stdio.h> #include <string.h> using namespace std ; int del_sub(char *str, char *sub) { char *psrc = str, *pdest = str; //兩個指標都指向str,將psrc指向的字元按規則挑出來給pdest char *p,*psub; char count=0; if((str == NULL) || (sub == NULL)) return 0; while(*psrc) { p = psrc; psub = sub; while(*p && *p == *psub) { p++; psub++; } if(*psub == 0)//找到一個子串 { psrc = p; count++; } else *pdest++ = *psrc++; } *pdest = 0; return count; } int main() { int num; char str[] = "1234ab1234c1234def1234"; char sub[] = "1234"; cout<<"first str = "<<str<<endl; cout<<"sub str = "<<sub<<endl; num = del_sub(str,sub); cout<<"number = "<<num<<endl; cout<<"new str = "<<str<<endl; system("pause"); return 0; }
這種程式的一個變種如下:
//*************************************************************************** //函式功能:一個字串由普通字元和回退字元組成,回退字元是可以任意 // 指定的,實現這樣一個函式將回退字元和被回退的字元都從字 // 符串裡刪除後輸出實現VOID foo(char *src, char backspace), // 比如“ABYYYYCYDEY”,如果Y是回退字元,輸出就是“D” // 最多刪除到字串的頭 //函式思想:/*將原串一個一個拷到目標串中,遇到backspace則將dest索引後移*/ //*************************************************************************** #include <stdio.h> #include <stdlib.h> void foo(char *src, char backspace) { char *psrc = src, *pdest= src; if(src == NULL) return; while(*psrc != '\0') { if((*psrc == backspace) && (pdest > src)) { pdest--; psrc++; } else if((*psrc == backspace) && (pdest == src)) psrc++; else *pdest++ = *psrc++; } *pdest = '\0'; return; } int main(void) { char aaa[] = "ABYYYYCYDEY"; foo(aaa,'Y'); printf("%s\n",aaa); system("pause"); return 0; }