删除一个字符串的一部分

时间:2021-03-27 14:57:38
请编写一个函数,删除一个字符串的一部分,函数的原型如下:
int del_substr(char *str,char const *substr )
函数首先应该判断substr是否出现在str中,如果它并未出现,函数就返回0;如果出现,函数应该把str 中位于该子串后面的所有字符复制到该子串的位置,从而删除这个子串,然后函数返回1。如果substr多次出现在str中,函数只删除第1次出现的子串,函数的第二个参数绝不被修改。
要求:1不能使用任何操纵字符串的库函数
2 不能使用下标
 
[cpp] view plain copy 
  
  
  1. /* 
  2. **删除一个字符串的一部分 
  3. */  
  4.   
  5. #include<stdio.h>  
  6. #include<string.h>  
  7.   
  8.   
  9. #define NUL '\0'  
  10. #define FALSE 0  
  11. #define TRUE 1  
  12.   
  13. char *match( char *str, char *want);  
  14. int del_substr( char *str, char  *substr );  
  15.   
  16.   
  17. int main()  
  18. {  
  19.     char str[] = "ABCDEFG";  
  20.     char *substr =  "CDE";  
  21.     del_substr(str, substr );  
  22.     puts( str );  
  23.     return 0;  
  24.   
  25. }  
  26.   
  27. /* 
  28. **为了清楚,单独写一个子函数实现判断两个字符串匹配 
  29. */  
  30. char *match( char *str, char *want)  
  31. {  
  32.     while( *want != NUL)   //在want中匹配str,如果有则返回剩余的字符
  33.         if( *str++ != *want++ )  
  34.             return NULL;  
  35.     return str;  
  36. }   
  37.   
  38. /* 
  39. **删除子串函数 
  40. */  
  41. int del_substr( char *str, char  *substr )  
  42. {  
  43.       
  44.     char *next;  
  45.     char *find = str;  
  46.   
  47.     /* 
  48.     **保证被操作字符串不为空 
  49.     ** 
  50.     */  
  51.     while( *find != NUL)  
  52.     {  
  53.         next = match( find, substr );  
  54.         if( next != NULL)  
  55.             break;  
  56.         find++;  
  57.     }  
  58.   
  59.     /* 
  60.     **到达源字符串文件尾的时候,说明没有子串 
  61.     */  
  62.     if( *find == NUL)  
  63.         return FALSE;  
  64.       
  65.     /* 
  66.     **被删除子串之后的字符复制操作 
  67.     */  
  68.     while( *find++ = *next++ );  
  69.   
  70.     return TRUE;  
  71.   
  72. }  
  73.