字符串左旋的三种方法
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的下标进行操作。