刪除字串中的子串

weixin_34391854發表於2013-08-03

請編寫一個函式,刪除一個字串的一部分。函式原型如下:
               int del_substr(char *str, char const *substr)
         函式首先應判斷substr是否出現在str中。如果它並未出現,函式就返回0;如果出現,函式應該把str中位於該子串後面的所有字元複製到該子串的位置,從而刪除這個子串,然後函式返回1。如果substr多次出現在str中,函式只刪除第1次出現的子串。函式的第2個引數絕不會被修改。
         舉個例子,假定str指向ABCDEFG。如果substr指向FGH、CDF或XABC,函式應該返回0,str未作任何修改。但如果substr指向CDE,函式就把str修改為指向ABFG,方法是把F、G和結尾的NUL位元組複製到C的位置,然後函式返回1。不論出現什麼情況,函式的第2個引數都不應該被修改。
        要求:a.你不應該使用任何用於操縱字串的庫函式(如strcpy, strcmp, 等)。
                    b.函式中的任何地方都不應該使用下標引用。
       一個值得注意的是,空字串是每個字串的一個子串,如果字串中刪除一個空字串不會產生變化。

 

/*
** Delete a portion of a string.
*/
#include <stdlib.h>
#include <stdio.h>

 

#define TRUE 1
#define FALSE 0

 


int del_substr(char *str, char const *substr);

 

int main()
{
    char str1 [] = "xyzabcjklmn";
    char const * str2= "axc";
  int ret;
    printf("before delete: %s\n", str1);
    printf("will delete che chars: %s\n", str2);
    ret = del_substr(str1, str2);
    printf("After delete : %s\n", str1);
    printf("ret = %d\n", ret);
    system("pause");
    return 0;
 }

 

int del_substr(char *str, char const *substr)
{
    char const * subP;
    char *strP;
    char *temp;
    int flag = TRUE;

 

    strP = str;
    if((!*str) || *substr == '\0')
        return FALSE;

 

    while(*strP)
    {       
        temp = strP;
        for(subP=substr; *subP; subP++)
        {
            if(*strP == *subP)
            {
                strP++;

      //flag = FALSE;
                continue;
             }
            break;
         }
       
        if(*subP == '\0')
        {
      flag = FALSE;
            while(*temp++ = *strP++)
             ;
            break;
         }
        if(flag)
            strP++;
     }
  if(*strP == '\0' && *subP != '\0')
   {
    return FALSE;
   }
    return TRUE;
 }

源程式借鑑於:http://blog.sina.com.cn/s/blog_798f21a00100wy2i.html

主要做了兩處修改:(這樣才滿足題意要求)

  flag=FALSE;由原來藍色處移到現在的紅色字型處;

  另外新增了

  if(*strP == '\0' && *subP != '\0')
   {
    return FALSE;
   }

相關文章