字符串左旋的三种方法
- 1. 一个一个字符挪
- 2. 库函数---strcpy和strncat
- 3. 三段逆置法
1. 一个一个字符挪
代码实现如下:
#include <stdio.h>
#include <string.h>
void Left_Reverse(char* str,int k)
{
int len = strlen(str);//6
int time = 0;
time = k % len;//真正要旋转的次数
int i = 0;
for (i = 0; i < time; i++)
{
int j = 0;
char tmp = str[0];
for (j = 0; j < len - 1; j++)
{
str[j] = str[j + 1];
}
str[j] = tmp;
}
}
int main()
{
char str[30] = "abcdef";
int k = 3;//要旋转几个字符
Left_Reverse(str,k);
printf("%s\n", str);
return 0;
}
画图说明:
这是循环执行一次的过程。上述代码中还要注意的是time=k%len.例如当k=7时,我们要旋转7次,但是当旋转第6次时字符串变回原样了,这就相当于还需旋转一次即可,k%len=1。
2. 库函数—strcpy和strncat
代码实现如下:
#include <stdio.h>
#include <string.h>
int main()
{
char str[30] = "abcdef";
int k = 2;
int len = strlen(str);
int time = k % len;
char tmp[256] = { 0 };
//把cdef拷贝进tmp数组中
strcpy(tmp, str + time);
//把str中的前两个字符追加到tmp中,此时tmp中是cdefab
strncat(tmp, str, time);
//最后把tmp拷贝回str中
strcpy(str, tmp);
printf("%s\n", str);
return 0;
}
画图演示:
这种方法是比较简便的,我们要了解strcpy和strncat函数的使用。
3. 三段逆置法
代码实现如下:
#include <stdio.h>
#include <string.h>
//实现字符串左右端字符的交换
void Reverse(char* str, int left, int right)
{
while (left < right)
{
char tmp =str[left];
str[left] = str[right];
str[right] = tmp;
left++;
right--;
}
}
void Left_Round(char* str, int k)
{
int len = strlen(str);
int time = k % len;
//三段逆置
Reverse(str, 0,time - 1);
Reverse(str, time,len-1);
Reverse(str, 0,len - 1);
}
int main()
{
char str[30] = "abcdef";
int k = 3;
Left_Round(str, k);
printf("%s\n", str);
return 0;
}
画图演示:
这里我们需要注意,我们定义的left和right是下标,在Reverse函数中我们也是对str的下标进行操作。