最近刷C语言时遇到了一个这样的题,让我思考了许久,想了一下还是打算分享一下自己的思路,希望各位师傅互相学习,错误或欠缺的地方能够指点迷津.
以下是我的思路
#include <stdio.h>
#include <string.h>
#include <malloc.h>
void move(char *s,int n)
{
int len=strlen(s);
char *p=s;
char *s2=(char *)malloc(len+1);//申请一块内存空间,相当于定义一个空数组
char *q=s2+n%len; //往后移动n位,使得s2前面空的格子就是s最后剩下的字符串需要填充的
while(*p)
{
*q++=*p++;//这里进行赋值,把开始的字符串先填充到空格的后面,因为前面的空格需要最后右移的字符串填充
if(q-s2>=len)
//判断q是否指到了s2的结尾,若指到结尾说明前面需要右移的已经移动完了
{
*q='\0';
q=s2;//指向开头处,接着循环,将前面空缺通过p补齐
}
strcpy(s,s2);//将轮转完后的字符串s2复制给s
free(s2);//释放内存空间
}
}
如果写的不够清晰,可以试着画个图去理解一下,大概原理应该就是前往后移动,后面的先空出来,最后再补到空缺部分里面