ABCD左旋一个字符得到BCDA ABCD左旋两个字符得到CDAB
该篇文章对左旋右旋进行探讨:
源代码如下:
#include <stdio.h>
#include <windows.h>
#include <assert.h>
#include <String.h>
#pragma warning (disable:4996)
//思路 先将要旋转的字符进行逆置,然后对剩下的字符进行逆置,最后对整体进行逆置
void reverse(char *left,char *right)
{
while (left < right)
{
*left ^= *right;
*right ^= *left;
*left ^= *right;
left++; right--;
}
}
void left_move(char *str, int k,int len)
{
assert(str!=NULL && k <= len);//DEBUG
if (str == NULL || k > len)
{
return; //release
}
reverse(str,str+k-1 );
reverse(str+k,str+len-1 );
reverse(str,str+len-1 );
}
void right_move(char *str, int k, int len) //右旋2位相当于左旋4位 所以用len减去左旋的位数即是右旋的位数
{
assert(str != NULL && k <= len);//DEBUG
if (str == NULL || k > len)
{
return; //release
}
reverse(str, str +len- k - 1);
reverse(str +len- k, str + len - 1);
reverse(str, str + len - 1);
}
int main()
{
char arr[] = { "abcdef" };
int i = 0;
int len = sizeof(arr) / sizeof(arr[0])-1; //写的时候错误将'\0'给算进去了,所以在交换的时候‘\0’将字符隔断,最后只输出一段字符
printf("请输入左旋几个字符: ");
scanf("%d", &i);
left_move(arr,i,len);
printf("旋转后的字符:%s \n",arr);
system("pause");
return 0;
}