编程实现字符串的循环右移

例题:输入一个字符串和一个整数,输出右移后的字符串。例如输入字符串str=“1234567”, 整型n=3,输出字符串str=“5671234”。

思想:step1.生成一个辅助数组temp[n]存放要前移的部分“567”。

         step2.将没有前移的部分从后向前依次向后移动。str变成“1231234”。

          step3.将辅助数组中的字符覆盖str前n位。str变成“5671234”。

char* Move(char *s, int n)
{
    assert(s!=NULL);
    int length=strlen(s);
    if(n%length==0)//移动为长度的倍数相当于没移动
        return s;
    char *t=s;
    char *temp=(char *)malloc(n);
    //t指针指向末尾最后一个字符
    while(*t){
        t++;
    }
    t--;
    //strlen函数实际上做了一次循环,这里其实可以用t-s+1得出length
    n=n%length;
    //将原字符串要提前的先储存进temp数组中
    for(int i=0;i<n;i++)
    {
        temp[i]=*(t-n+1+i);
    }
    //将原字符串要往后挪的字符从后往前依次向后挪n个位置
    for(int i=0;i<(length-n);i++){
        *(t-i)=*(t-n-i);
    }
    //将temp数组中的字符串覆盖原字符串的前n个位置
    for(int i=0;i<n;i++){
        s[i]=temp[i];
    }
    //释放堆内存
    free(temp);
    return s;

}
int main(){
    char str[100]="";
    int n=0;
    scanf("%s %d",str,&n);
    Move(str,n);
    cout<<str;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_41710905/article/details/79611036