您的位置:首页 > 其它

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

2017-07-18 20:52 337 查看
编写一个函数,作用是把一个 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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: