1. 程式人生 > >刪除字串中特定的子串

刪除字串中特定的子串

//*********************************************************************************
//【功能】在給定字串中查詢所有特定子串並刪除,如果沒有找到相應子串,則不作任何操作。
//【輸入】 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;
}
注意:*str++中,*和++同級,但是從左往右操作,i=*str++ 相當於 i=*(str++),又相當於 i=*str; str++;這一點可以從strcpy函式原型裡可以看出來,見:http://blog.csdn.net/zzwdkxx/article/details/8693315

下面是一個新的思路:

//*********************************************************************************
//【功能】在給定字串中查詢所有特定子串並刪除,如果沒有找到相應子串,則不作任何操作。
//【思路】將不是子串的字元拷貝。
//********************************************************************************
#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;
}