字符串左旋的三种方法
- 1. 一个一个字符挪
- 2. 库函数---strcpy和strncat
- 3. 三段逆置法
1. 一个一个字符挪
代码实现如下:
#include <stdio.h>
#include <string.h>void Left_Reverse(char* str,int k)
{int len = strlen(str);//6int 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中是cdefabstrncat(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的下标进行操作。