生无涯

吾生也有涯,而知也无涯,以无涯随有涯,乐以忘忧,生亦无涯矣www.cnblogs.com/shengwuya
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

a program a day 9

Posted on 2010-10-05 09:40  生无涯  阅读(163)  评论(0编辑  收藏  举报

/**
实现字符串的循环右移功能,如loopMove("abcde",3)得"cdeab"
**/
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
/*
算法一:将最后一个字符存入tmp,将前面其他各位依次后移一位,再将tmp中的数存入首位,如此循环n次,将后面的n位移至前面
*/
int loopMove(char * str,int n)
{
 char tmp;
 int len = strlen(str);
 if(n > len)
 return 0;
 for(int i = 0;i < n;i++)
 {
  tmp = str[len-1];
  for(int j = 0;j < len-1;j++)
  {
   str[len-1-j] = str[len-2-j];
  }
  str[0] = tmp;
 }
 return 1; 
}
/*
算法二:将后面的n个存入新建字符串中,将原字符串前len-n个后移,再将新建字符串中的数拷贝至原字符串前n个
*/
int loopMove1(char * str,int n)
{
 int len = strlen(str);
 //存储后n个字符
 char * tmp = (char *)malloc(n+1);
 if(!tmp)
 return 0;
 for(int i = 0; i < n;i++)
 {
  tmp[i] = str[len-n+i]; 
 }
 tmp[n] = '\0';
 //前len-n个后移
    for(int j = 0;j < len-n;j++)
 {
  str[len-1-j] = str[len-1-n];
 }
 //tmp中的n个元素拷贝至原字符串
 for(int k = 0;k < n;k++)
 {
  str[k] = tmp[k];
 }
 free(tmp);
 return 1;
}
int main()
{
 char str[] = "abcdefghijk";
 printf("the original string is     :  %s\n",str);
 loopMove(str,5);
 printf("the string be loopMoved is :  %s\n",str);

 char str1[] = "qwertyu";
 printf("the original string is     :  %s\n",str1);
 loopMove(str1,3);
 printf("the string be loopMoved is :  %s\n",str1);
 return 1;
}