部分来自<<程序员面试宝典>>

#include<stdio.h>
#include<string.h>

//字符串循环右移
void strMove1(char *pStr,int steps)
{
        int n=strlen(pStr)-steps;
        char tmp[20];
        strcpy(tmp,pStr+n);//先保存要调头的字符,因为下面前移的时候可能被覆盖
        //printf("%s\n",tmp);

        strcpy(tmp+stpes,pStr);//赋值剩下的字符串,对tmp前移了,前移的空位来保存被调头的字符
        //printf("%s\n",tmp);

        *(tmp+strlen(pStr))='\0';//用'\0'截断
        strcpy(pStr,tmp);
        printf("%s\n",pStr);
}


//字符串循环的右移
void strMove2(char *pStr,int steps)
{
       int n=strlen(pStr)-stpes;
       char tmp[20];

       memcpy(tmp,pStr+n,steps);//先初始化tmp为要调头的字符
       memcpy(pStr+steps,pStr,n);//对要掉头后面位置指定初始化字符
       memcpy(pStr,tmp,steps);//补前面的

       printf("%s\n",pStr); 

}

//字符串奇数位的右移
void strMove3(char *pStr)
{
      int i,n,k;
      char c;
      n=0;
      for(i=0;pStr[i]!='\0';i++)
        n++;
      if(0==n%2)
        k=n-1;
      else
        k=n-2;

      c=pStr[k];//保存第一个奇数
      for(i=k-2;i>=1;i=i-2)//奇数位的前移2位
         pStr[i+2]=pStr[i];
      pStr[1]=c;//归位     
}

int main()
{
      int n=2;
      char str1[20]="abcde";
      strMove1(str1,n);

      char str2[20]="abcde";
      strMove2(str2,n);

      char str3[20]="abcdefg";
      strMove3(str3);
      printf("%s\n",str3);

       return 0;
}

 

打印:deabc

            deabc

            afcbedg

再看一个函数:

memset(s,ch,n):将s所指向的某一块内存中的前n个字节的内容全部设置为ch指定的ASCII值,这个函数通常为新申请的内存做初始化工作

 

再看一个数组的移动:

 

#define N 10
#include<iostream>
using namespace std;

//数组的循环移动
void arrMove(int w[],int p,int n)//p为要循环移动的位数
{
     int x,j,tmp;
     for(x=0;x<=p;x++)//每一次外围的for循环,都会使这个数组移动一次,且调用的数完成归位
     {
           tmp=w[0];//每次都归位了,w[0]也是不断在变化
           for(j=1;j<n;j++)
                w[j-1]=w[j];
           w[n-1]=pos;
     }
}

int main()
{
     int a[N]={1,2,3,4,5,6,7,8,9,10};
     int i,n=10;
   
     arrMove(a,5,n);
     for(i=0;i<N;i++)
           cout<<a[i]<<endl;

     retrun 0;
}


打印:7

 

         8

         9

         10

         1

         2

         3

         4

         5

         6
 

循环移动:用字符串相关函数拼接字符,都是先保存要循环调头移动的字符,再进行拼接或移动,再完成归位操作。