部分来自<<程序员面试宝典>>
#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
循环移动:用字符串相关函数拼接字符,都是先保存要循环调头移动的字符,再进行拼接或移动,再完成归位操作。