7.11 本章实例

2013-10-07 01:14:34 · 作者: · 浏览: 61

7.11  本章实例

本节以一个字符串处理程序向读者展示指针的使用。

问题:在一个字符串内容中删除某些字符串。

算法:逐字符比较,若不相等就保留,相等就删除。

【实例7-1】 字符串处理程序代码。

  1. #include "stdafx.h"  
  2. #include <iostream.h>  
  3. #define _MAX_ 256                               //字符串最大长度  
  4. int delstring(char **target,char *source);      //删除字符串的函数  
  5. int main()  
  6. {  
  7.     char *p_target=0;  
  8.     char *p_source=0;  
  9.     int k=0;  
  10.     p_target=new char[_MAX_];                   //申请空间  
  11.     p_source=new char[_MAX_];                   //申请空间  
  12.     cout<<"请输入目标串: ";  
  13.     cin>>p_target;  
  14.     cout<<"请输入删除串: ";  
  15.     cin>>p_source;  
  16.     cout<<"在\""<<p_target<<"\"内删除\""<<p_source<<endl;  
  17.     cout<<"---------------"<<endl;  
  18.     if (strlen(p_target)<strlen(p_source))        
  19.         cout<<"目标串长度小于替换串!"<<endl;  
  20.     else 
  21.     {  
  22.        k=delstring(&p_target,p_source);         //删除  
  23.         if (k>0)                                    //成功  
  24.             cout<<p_target<<endl;  
  25.         else 
  26.             cout<<"没找到!"<<endl;  
  27.     }  
  28.     delete[] p_target;                          //释放  
  29.     delete[] p_source;  
  30.         p_target=0;                                 //赋空值  
  31.         p_source=0;  
  32.         return 0;  
  33. }  
  34. int delstring(char **target,char *source)  
  35. {  
  36.     char *p_target=*target;  
  37.     char *p_source=source;  
  38.     char *p_temp=0;  
  39.     char *p_next=0;  
  40.     int pos=0;  
  41.     p_temp=new char[strlen(*target)];           //申请临时空间  
  42.     p_next=p_temp;                              //保留指针头  
  43.     while(strlen(p_target)>=strlen(source))  
  44.     {  
  45.         if (*p_target==*p_source)               //寻找相等串  
  46.         {  
  47.             for(pos=0;pos<strlen(source);pos++)  
  48.             {  
  49.                 if (*(p_target+pos)!=*p_source)   
  50.                     break;                          //寻找结束  
  51.                 p_source++;                     //移动到下一个单元  
  52.             }  
  53.             //部分相等时,复制串  
  54.             if (pos<strlen(source))  
  55.             {  
  56.                 for(int i=0;i<pos;i++)  
  57.                 {  
  58.                     *p_next=*(p_target+i);      //复制数据单元  
  59.                     p_next++;                   //移动下一个单元  
  60.                 }  
  61.             }  
  62.             else 
  63.           {  
  64.                 p_target+=pos;              //跳过复制过的串  
  65.                 p_source=source;                //原串回溯到开始处,准备下一轮比较  
  66.            }  
  67.         }  
  68.         else 
  69.         {  
  70.             *p_next=*p_target;              //复制原串中不相等的字符  
  71.            p_next++;                        //移动下一个单元  
  72.              p_target++;  
  73.         }  
  74.     }  
  75.     //复制剩余的串  
  76.     while(*p_target!='\0')  
  77.     {  
  78.         *p_next=*p_target;                  //复制字符  
  79.         p_next++;                           //移动到下一个字符  
  80.         p_target++;   
  81.     }  
  82.     *p_next='\0';                           //加字符串结束符  
  83.     delete[] *target;  
  84.     *target=p_temp;  
  85.  return 1;  

分析:代码中的delstring函数负责字符串的删除,该函数分两部分。首先是创建一个临时空间存放处理后的串,然后判断原串中是否有与目标串相等的串。判断时逐个比较,如果全部相等就不需要再转移到临时空间中;如果不相等就需要转移。由于原串可能比目标串要长,所以当比较到后期时,原串中剩余的子串长度可能已经小于目标串,只需直接复制到临时空间中即可。

【责任编辑:云霞 TEL:(010)68476606】

回书目   上一节   下一节