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

[cpp] view plaincopyprint?
/* 
给出一个函数来合并两个字符串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;  
            }  
        }  
    }  
}  

/*
给出一个函数来合并两个字符串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;
			}
		}
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值