- /*
- 给出一个函数来合并两个字符串A和B。字符串A的后几个字节和字符串B的前几个字节重叠。
- //*/
- #include <iostream>
- #include <iomanip>
- #include <limits>
- using namespace std;
- void copystr(char pachar[], char pbchar[], int sza, int szb, char* &result);
- int main()
- {
- char pachar[] = "asdfvxcbnbvcxzghgh";
- char pbchar[] = "ghjklqwe";
- int sza = sizeof(pachar);
- int szb = sizeof(pbchar);
- int sz = sza + szb - 1;
- char* result = new char[sz];
- copystr(pachar, pbchar, sza, szb, result);
- cout << result << endl;
- return 0;
- }
- void copystr(char pachar[], char pbchar[], int sza, int szb, char* &result)
- {
- int posa = 0;
- int posb = 0;
- int pos = 0;
- int sa = 0;
- int sz = sza + szb - 1;
- while(pos < sz && posa < sza - 1 && posb < szb - 1){ // 字符串索引为 [0 ~ size -1], 最后一个字符为结束字符‘\0’,因此有效字符索引 index < size -1
- // 如果a串中没找找到与b串中首字符相匹配的,则说明不存在重叠,
- // 在找到重叠之前,将a串中相应字符拷贝到目标串
- while((pachar[posa] != pbchar[0]) && (posa < sza - 1)){
- result[pos] = pachar[posa];
- ++pos;
- ++posa;
- }
- // 拷贝a串停止,两种可能情况分别处理: 一是拷贝到a串末尾,二是遇到与b串首字符相匹配的情况
- if(posa == sza - 1){ // 拷贝到末尾, 继续拷贝b串直至结束
- while(posb <= szb - 1){
- result[pos] = pbchar[posb];
- ++pos;
- ++posb;
- }
- break;
- }else{ // 遇到相同字符,分两种情况,一是遇到重叠字串,即a串此处开始的部分与b串的起始部分完全相同,二是偶遇相同字符,不是头尾重叠
- sa = posa; // 为不是重叠的结果保存备用记录
- while((pachar[posa] == pbchar[posb]) && (posa < sza - 2) && (posb < szb - 2)){ // 循环判断是否完全重叠
- ++posa;
- ++posb;
- }
- if(posa == sza - 2){ // 重叠
- posb = 0; // 恢复posb初始位置
- while(posb <= szb - 1){
- result[pos] = pbchar[posb];
- ++pos;
- ++posb;
- }
- break;
- }else{ // 偶遇相同字符
- posa = sa; // 恢复 posa 偶遇 b[0] 位置
- posb = 0; // 恢复posb初始位置
- result[pos] = pachar[posa];
- ++pos;
- ++posa;
- }
- }
- }
- }