C语言请实现字符串循环右移函数。列如字符串“abcdefghi”向右移2位就是“hiabcdefg”

来源:互联网 发布:sql语句where多个条件 编辑:程序博客网 时间:2024/06/09 16:03

题目:请实现字符串循环右移函数。

列如字符串“abcdefghi”向右移2位就是“hiabcdefg”

函数原型为:void RightLoopMove(char *pstr,unsigned short steps)

函数参数说明:
   pStr: Point to a ‘\0’ terminated string

   steps: The rotate shift numbers


方法一:分三次翻转达到右移字符串的目的


代码实现如下:

#include <stdio.h>#include <string.h>#include <assert.h>void reverse(char *left, char *right){char temp;assert(left);assert(right);while (left < right){temp = *left;*left = *right;*right = temp;left++;right--;}}void RightLoopMove(char *pstr, unsigned short steps){int n = strlen(pstr);reverse(pstr, pstr + n - steps - 1);//第一次循环reverse(pstr + n - steps, pstr + n - 1);//第二次循环reverse(pstr, pstr + n - 1);//第三次循环}int main(){char arr[] = "abcdefghi";RightLoopMove(arr, 2);printf("%s\n", arr);system("pause");return 0;}



方法二:首先将最后一个字符赋给一个临时变量,再将前面的字符依次往后挪动一个位置,最后再把临时变量赋给第一个字符,重复上述步骤,从而达到右旋字符串的目的。

实现方法图示:


代码实现如下:

#include <stdio.h>#include <string.h>#include <assert.h>void RightLoopMove(char *pStr, unsigned short steps){assert(pStr);assert(steps);char *left = pStr;char *right = pStr + strlen(pStr) - 1;while (steps){char tmp = *right;char *p = right;while (p > left){*p = *(p - 1);p--;}*left = tmp;steps--;}}int main(){char a[] = "abcdefghi";RightLoopMove(a, 2);printf("%s\n", a);system("pause");return 0;}

方法三:运用库函数strcpy,此方法也很简便。

实现代码如下:

#include<stdio.h>  #include<string.h>  #include<assert.h>   #define MAX_LEN 20  #pragma warning(disable:4996)void RightLoopMove(char *pStr, unsigned short steps){assert(pStr);char arr[MAX_LEN] = { 0 };int n = strlen(pStr) - steps;strcpy(arr, pStr + n);     //需要移位的字符拷给arr  strcpy(arr + steps, pStr);   //再把剩下的字符拷给arr  *(arr + strlen(pStr)) = '\0';   //上一步会多拷steps个字符,加\0的同时也解决了这个问题。  strcpy(pStr, arr);       //arr里的字符拷给源串  }int main(){char arr[] = "abcdefghi";RightLoopMove(arr, 2);  //测试右移两位  printf("%s", arr);getchar();return 0;}






0 0
原创粉丝点击