C字符串逆序、逆置

仔细注意指针是怎么移动的

01.申请内存进行swap;

       注意参数使用的是const,以及函数体内p、q指针的移动速度,为什么用q -= 2;为什么sizeof(char) * (q - s + 2);

char* Reverse1(const char* s)
{
    //将q指向字符串最后一个字符
    char* q = (char*)s ;
    while( *q++ ) ;
    q -= 2 ; 
	
    //分配空间,存储逆序后的字符串。
    char* p = new char[sizeof(char) * (q - s + 2)] ; 
    char* r = p ;
	
    // 逆序存储
    while(q >= s)
        *p++ = *q-- ;
    *p = '\0' ;
	
    return r ;
}


02.使用指针进行swap

char* Reverse2(char* s)
{
    // p指向字符串头部
    char* p = s ;
	
    // q指向字符串尾部
    char* q = s ;
    while( *q )
        ++q ;
    q -- ;
	
    // 交换并移动指针,直到p和q交叉
    while(q > p)
    {
        char t = *p ;
        *p++ = *q ;
        *q-- = t ;
    }//swap
	
    return s ;
}


03.对字符串s在区间left和right之间进行逆序,递归法、下标法

void Reverse3( char* s, int left, int right )
{
    if(left >= right)
        return;
	
    char t = s[left] ;
    s[left] = s[right] ;
    s[right] = t ;
	
    Reverse3(s, left + 1, right - 1) ;
}


04.对字符串s在区间left和right之间进行逆序,下标法

char* Reverse4( char* s, int left, int right )
{
    while( left < right )
    {
        char t = s[left] ;
        s[left++] = s[right] ;
        s[right--] = t ;
    }//swap
	
    return s ;
}


05.使用异或操作对字符串s进行逆序

char* Reverse5(char* s)
{
    char* r = s ;
	
    //令p指向字符串最后一个字符
    char* p = s;
    while (*(p + 1) != '\0')
        ++p ;
	
    // 使用异或操作进行交换
    while (p > s)
    {
        *p = *p ^ *s ;
        *s = *p ^ *s ;
        *p = *p-- ^ *s++ ;
    }//swap
	
    return r ;
}


测试程序如下

int main()
{
	char arr1[]="abcdefg";
	char arr2[]="abcdefg";
	char arr3[]="abcdefg";
	char arr4[]="abcdefg";
	char arr5[]="abcdefg";
	char arr6[]="abcdefg";

	cout<<"arr1Reversed : "<<Reverse1(arr1)<<endl;
	cout<<"arr2Reversed : "<<Reverse2(arr2)<<endl;

	Reverse3(arr3,0,6);	
	cout<<"arr3Reversed : "<<arr3<<endl;

	cout<<"arr4Reversed : "<<Reverse4(arr4,0,6)<<endl;
	cout<<"arr5Reversed : "<<Reverse5(arr5)<<endl;

	return 0;
}


呵呵 先到这里吧

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值