给出一个函数来合并两个字符串A和B。字符串A的后几个字节和字符串B的前几个字节重叠

给出一个函数来合并两个字符串A和B。字符串A的后几个字节和字符串B的前几个字节重叠       

http://blog.csdn.net/zshtang/article/details/6611372

分类: c/c++ 数据结构+算法 2468人阅读 评论(2) 收藏 举报
  1. /* 
  2. 给出一个函数来合并两个字符串A和B。字符串A的后几个字节和字符串B的前几个字节重叠。 
  3. //*/  
  4.   
  5. #include <iostream>   
  6. #include <iomanip>   
  7. #include <limits>   
  8.   
  9. using namespace std;  
  10. void copystr(char pachar[], char pbchar[], int sza, int szb,  char* &result);  
  11.   
  12. int main()  
  13. {  
  14.     char pachar[] = "asdfvxcbnbvcxzghgh";  
  15.     char pbchar[] = "ghjklqwe";  
  16.   
  17.     int sza = sizeof(pachar);  
  18.     int szb = sizeof(pbchar);  
  19.     int sz = sza + szb - 1;  
  20.     char* result = new char[sz];  
  21.   
  22.     copystr(pachar, pbchar, sza, szb, result);  
  23.       
  24.     cout << result << endl;  
  25.   
  26.     return 0;  
  27. }  
  28.   
  29. void copystr(char pachar[], char pbchar[], int sza, int szb, char* &result)  
  30. {  
  31.         int posa = 0;  
  32.     int posb = 0;  
  33.     int pos = 0;  
  34.     int sa = 0;  
  35. int sz = sza + szb - 1;  
  36.     while(pos < sz && posa < sza - 1 && posb < szb - 1){   // 字符串索引为 [0 ~ size -1], 最后一个字符为结束字符‘\0’,因此有效字符索引 index < size -1   
  37.   
  38.         // 如果a串中没找找到与b串中首字符相匹配的,则说明不存在重叠,   
  39.         // 在找到重叠之前,将a串中相应字符拷贝到目标串   
  40.         while((pachar[posa] != pbchar[0]) && (posa < sza - 1)){   
  41.             result[pos] = pachar[posa];  
  42.             ++pos;  
  43.             ++posa;  
  44.         }  
  45.           
  46.         // 拷贝a串停止,两种可能情况分别处理: 一是拷贝到a串末尾,二是遇到与b串首字符相匹配的情况  
  47.         if(posa == sza - 1){  // 拷贝到末尾, 继续拷贝b串直至结束  
  48.                 while(posb <= szb - 1){  
  49.                 result[pos] = pbchar[posb];  
  50.                 ++pos;  
  51.                 ++posb;  
  52.             }  
  53.             break;  
  54.         }else{  // 遇到相同字符,分两种情况,一是遇到重叠字串,即a串此处开始的部分与b串的起始部分完全相同,二是偶遇相同字符,不是头尾重叠  
  55.             sa = posa; // 为不是重叠的结果保存备用记录   
  56.             while((pachar[posa] == pbchar[posb]) && (posa < sza - 2) && (posb < szb - 2)){ // 循环判断是否完全重叠  
  57.                 ++posa;  
  58.                 ++posb;  
  59.             }  
  60.             if(posa == sza - 2){ // 重叠  
  61.                 posb = 0;   // 恢复posb初始位置   
  62.                 while(posb <= szb - 1){  
  63.                     result[pos] = pbchar[posb];  
  64.                     ++pos;  
  65.                     ++posb;  
  66.                 }  
  67.                 break;  
  68.             }else// 偶遇相同字符  
  69.                 posa = sa; // 恢复 posa 偶遇 b[0] 位置  
  70.                 posb = 0;   // 恢复posb初始位置   
  71.                 result[pos] = pachar[posa];  
  72.                 ++pos;  
  73.                 ++posa;  
  74.             }  
  75.         }  
  76.     }  
  77. }  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值