C语言请实现字符串循环右移函数。列如字符串“abcdefghi”向右移2位就是“hiabcdefg”

题目:请实现字符串循环右移函数。

列如字符串“abcdefghi”向右移2位就是“hiabcdefg”

函数原型为:void RightLoopMove(char *pstr,unsigned short steps)

函数参数说明:
   pStr: Point to a ‘\0’ terminated string

   steps: The rotate shift numbers


方法一:分三次翻转达到右移字符串的目的

C语言请实现字符串循环右移函数。列如字符串“abcdefghi”向右移2位就是“hiabcdefg”_第1张图片

代码实现如下:

#include 
#include 
#include 
void reverse(char *left, char *right)
{
	char temp;
	assert(left);
	assert(right);
	while (left < right)
	{
		temp = *left;
		*left = *right;
		*right = temp;
		left++;
		right--;

	}
}
void RightLoopMove(char *pstr, unsigned short steps)
{
	int n = strlen(pstr);
	reverse(pstr, pstr + n - steps - 1);//第一次循环
	reverse(pstr + n - steps, pstr + n - 1);//第二次循环
	reverse(pstr, pstr + n - 1);//第三次循环
}
int main()
{
	char arr[] = "abcdefghi";
	RightLoopMove(arr, 2);
	printf("%s\n", arr);
	system("pause");
	return 0;
}



方法二:首先将最后一个字符赋给一个临时变量,再将前面的字符依次往后挪动一个位置,最后再把临时变量赋给第一个字符,重复上述步骤,从而达到右旋字符串的目的。

实现方法图示:

C语言请实现字符串循环右移函数。列如字符串“abcdefghi”向右移2位就是“hiabcdefg”_第2张图片

代码实现如下:

#include 
#include 
#include 
void RightLoopMove(char *pStr, unsigned short steps)
{
	assert(pStr);
	assert(steps);
	char *left = pStr;
	char *right = pStr + strlen(pStr) - 1;
	while (steps)
	{
		char tmp = *right;
		char *p = right;
		while (p > left)
		{
			*p = *(p - 1);
			p--;
		}
		*left = tmp;
		steps--;
	}
}
int main()
{
	char a[] = "abcdefghi";
	RightLoopMove(a, 2);
	printf("%s\n", a);
	system("pause");
	return 0;
}

方法三:运用库函数strcpy,此方法也很简便。

实现代码如下:

#include  
#include  
#include   
#define MAX_LEN 20  
#pragma warning(disable:4996)
void RightLoopMove(char *pStr, unsigned short steps)
{
	assert(pStr);
	char arr[MAX_LEN] = { 0 };
	int n = strlen(pStr) - steps;
	strcpy(arr, pStr + n);     //需要移位的字符拷给arr  
	strcpy(arr + steps, pStr);   //再把剩下的字符拷给arr  
	*(arr + strlen(pStr)) = '\0';   //上一步会多拷steps个字符,加\0的同时也解决了这个问题。  
	strcpy(pStr, arr);       //arr里的字符拷给源串  
}
int main()
{
	char arr[] = "abcdefghi";
	RightLoopMove(arr, 2);  //测试右移两位  
	printf("%s", arr);
	getchar();
	return 0;
}






你可能感兴趣的:(C/C++,C/C++之路)