编写一个函数,作用是把一个 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;
}