首页 > 编程语言 > 详细

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

时间:2015-03-24 21:22:37      阅读:406      评论:0      收藏:0      [点我收藏+]

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

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

左移n个

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

}

技术分享

技术分享

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


技术分享


对于左移应该与右移雷同



/****************************************   
*  File Name  : loopMove.c   
*  Creat Data : 2015.3.24  
*  Author     : wk   
*****************************************/   

#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;
}












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

原文:http://blog.csdn.net/kai8wei/article/details/44596053

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!