全部来自http://blog.csdn.net/v_JULY_v/article/details/6322882
作者:July
非常感谢作者能提供这么好的文章。。。。。
这里写下自己代码,留着复习用。。。
方法一:
#include <stdio.h> #include <stdlib.h> #include <string.h> #define swap(x,y) ({ \ (void)(&x == &y); \ typeof(x) _z; \ _z = x; \ x = y; \ y =_z; \ }) void Reverse(char *str,int Start,int End) { for( ; Start < End; ++Start, --End){ swap(str[Start],str[End]); } return; } char *Shift(char *str,int k) { int N; if(str == NULL) return NULL; N = strlen(str); k %= N; if(k > 0){ Reverse(str,0,N-k-1); Reverse(str,N-k,N-1); Reverse(str,0,N-1); } else{ Reverse(str,0,-1-k); Reverse(str,0-k,N-1); Reverse(str,0,N-1); } return str; }
方法二:#define swap(x,y) ({ \ (void)(&x == &y); \ typeof(x) _z; \ _z = x; \ x = y; \ y =_z; \ }) char *Shift(char *str, int k) { if(str == NULL|| k<=0){ return NULL; } int N = strlen(str); k %= N; int p1 =0,p2 = k; //先是p2能走多少走多少 while(N - p2 >= k){ int m = k; while(m--){ swap(str[p1],str[p2]);//因为这里用的宏,千万不能str[p1++]啊 ++p1; ++p2; } } //然后处理尾部 while(p2 < N){ int j=p2; while(j>p1){ swap(str[j-1],str[j]); --j; } ++p1; ++p2; } return str; } scanf("%d",&num); char A[] ="abcd1234"; puts(Shift(A,num)); return 0; }
方法三:void Shift(char *str, int start,int end,int k,BOOL flag) { if(str == NULL || k == 0 || start == end || start < 0) return; int N = end - start + 1; int i = N / k - 1; if(flag == TRUE){ int p1 = start, p2 = p1 + k; while(i--){ int j = k; for(;j>0;--j,++p1,++p2){ swap(str[p1],str[p2]); } } Shift(str,p1,end,N % k,FALSE); } else{ int p1 = end - k, p2 = end; for(;i > 0;--i){ int j = k; for(;j>0;--j,--p1,--p2){ swap(str[p1],str[p2]); } } Shift(str,start,p2,N % k,TRUE); } return; }