例子:现有一个字符串 char str[] = "abcdefg", 右移3次后变成"efgabcd"
1、方法一
利用遍历和交换的方法直接实现,
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void loopMoveRight(char *str, int n)
{
if(str == NULL)
{
printf("str NULL");
return;
}
printf("原字符串:%s\n", str);
int len = strlen(str);
for (int i = 0; i < n; ++i)
{
char temp = str[len - 1];
int k = len - 2;
while (k >= 0)
{
str[k + 1] = str[k];
--k;
}
str[0] = temp;
}
printf("循环右移N次后字符串:%s\n", str);
}
int main()
{
char str[] = "abcdefg";
loopMoveRight(str, 3);
return 0;
}
2、方法二
调用库函数
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void loopMoveRight(char *str, int n)
{
if(str == NULL)
{
printf("str NULL");
return;
}
printf("原字符串:%s\n", str);
int len = strlen(str);
char* temp = (char*)malloc(len);
int m = strlen(str) - n;
strncpy(temp, str, m); //将字符串的前m个字符复制到temp中
temp[n] = '\0'; //strncpy不会在末尾自动添加'\0'
strcpy(str, str + m); //把str从第m个位置起的n个字符复制到strk开头(即从起始位置开始覆盖原字符)
strcat(str, temp);
//注意:只使用strncpy()函数也是可以实现全部过程
printf("循环右移N次后字符串:%s\n", str);
}
int main()
{
char str[] = "abcdefg";
loopMoveRight(str, 3);
return 0;
}
3、方法三
空间换时间,通过内存拷贝实现
需要新申请一块相同大小的内存,把原字符串的后n个字节拷贝到它的开始地址,把原字符串的前(len-n)个字节拷贝到它的(开始地址+n)处。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void loopMoveRight(char *str, int n)
{
if(str == NULL)
{
printf("str NULL");
return;
}
printf("原字符串:%s\n", str);
int len = strlen(str);
char *temp = (char*)malloc(len);
memcpy(temp, str + len - n, n);
memcpy(temp + n, str, len - n);
memcpy(str, temp, len);
free(temp);
printf("循环右移N次后字符串:%s\n", str);
}
int main()
{
char str[] = "abcdefg";
loopMoveRight(str, 3);
return 0;
}
4、方法四
利用字符串的逆序实现
比如字符串"abcdefg",要循环右移3位,那么这个字符串可以分为2部分:
前半部分:"abcd" 和后半部分 "efg"。
我们先把前半部分逆序变成 -> "dcba"
再把后半部分逆序变成 -> "gfe"
这时整体字符串应该是 "dcbagfe"
我们再对整个字符串逆序一遍,结果-> "efgabcd"。
循环右移完成。
总共要进行3次逆序:前半部分逆序,后半部分逆序,整体逆序。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void str_reverse(char *str, int left, int right)
{
if(str == NULL)
{
printf("str NULL");
return;
}
char temp;
while(left < right)
{
temp = str[left];
str[left++] = str[right]; //即 stt[left] = str[right]; left++; // left++先使用原来的值,再将其值加一
str[right--] = temp;
}
}
void loopMoveRight(char *str, int n)
{
if(str == NULL)
{
printf("str NULL");
return;
}
printf("原字符串:%s\n", str);
str_reverse(str, 0, strlen(str) - n - 1);
str_reverse(str, strlen(str) - n, strlen(str) - 1);
str_reverse(str, 0, strlen(str)- 1);
printf("循环右移N次后字符串:%s\n", str);
}
int main()
{
char str[] = "abcdefg";
loopMoveRight(str, 3);
return 0;
}