实现字符串循环右移n 位与左移n位(不建立数组,直接用指针)

编写一个函数,作用是把一个 char 组成的字符串循环
右移 n 个。
比如原来是“abcdefghi”

如果 n=2,移位后应该是“hiabcdefgh”

左移n个

比如原来是“abcdefghi”
如果 n=2,移位后应该是“cdefghiab”
函数头是这样的:
//pStr 是指向以'\0'结尾的字符串的指针
//steps 是要求移动的 n
void LoopMove ( char * pStr, int steps )
{
//...

}

\

\

(对上图指向的说明) 只是这个指向的空间的值已经改变了

 

\

 

对于左移应该与右移雷同

 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
void reserve(char *p, char *q)
{
    while(p < q)
    {
        *p ^= *q;  //利用异或运算得到两字符交换
        *q ^= *p;
        *p ^= *q;
                 /*
                 *p = *p+ *q;  
                 *q = *p-*q;
                 *p = *p-*q;*/
        p++;
        q--;
    }
}
void loopMove(char *str, int steps)
{
    char *p = str;
    int len = strlen(str);
    char *q = p + len - 1 - steps;
     
    reserve(p, q);   //先翻转前一段,这里调用函数只是指针的拷贝,没有返回指针,函数在用那个作用域中的指针改变了字符串数组中的值并没有返回来,所以这语句之后p=str q=str+len-1-steps  没有改变
    p = q + 1;
    q = str + len - 1;
    reserve(p, q);   //翻转后一段,同理,函数返回之后,p,q 还是 上两句改变之后的值
    p = str;
    reserve(p, q);   //翻转整个字符串,同理,函数返回之后,p,q 还是 上句改变之后的值
     
}
 
int main()
{
    char string[] = "12345678";//
    int steps = 0;
 
    printf("string: %s\n", string);
    printf("input step: ");
    scanf("%d", &steps);
    loopMove(string,steps);
    printf("after loopMove %d: %s\n", steps, string);
 
    return 0;
}

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值