字符串轮换

来源:互联网 发布:集思宝怎么导出数据 编辑:程序博客网 时间:2024/05/16 08:50

串“abcd”每个字符都向右移位,最右的移动到第一个字符的位置,就变为“dabc”。这称为对串进行位移=1的轮换。同理,“abcd”变为:“cdab”则称为位移=2的轮换。

下面的代码实现了对串s进行位移为n的轮换

#include <iostream>#include <string>using namespace std;void shift(char *s,int n){     char* p;   //声明两个指针 p 在原串 s 上移动,指针 q 在新开辟的空间移动       char* q;     int len=strlen(s);     if(len==0) return;     if(n<=0||n>=len) return;          char* s2 = (char*) malloc(sizeof(char)*len); //新开辟的空间用于暂时存放的      p=s;                                         //移动后的元素      q=s2+n%len;   //求出原串 s 的第一个元素移动后应该放到 s2 空间的那个位置      while(*p)           {              *q++=*p++;              if(q-s2>=len)   //判断 q 指针在 s2上是否已达到原串的长,如果如果               {               //超出了,就把 q 指针移到 s2 的开头,继续从 s 原串                   *q='\0';   //中拷贝剩下的元素                   q = s2;              }     }     strcpy(s,s2);     free(s2);}int main(){    char a[50]="qwewrerhjksd";    shift(a,2);    puts(a); //输出移动后的字符串     system("pause");    return 0;}