如题:实现一个函数,可以左旋字符串中的k个字符。
ABCD左旋一个字符得到BCDA
ABCD左旋一个字符得到BCDA
ABCD左旋两个字符得到CDAB
#define _CRT_SECURE_NO_WARNINGS 0
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//解法1:移出首字符,整体移动剩下的字符,再将移出的字符补回来
void code_turnleft(char *arr, int n)
{
int i = 0; int j = 0;
int sz = sizeof(arr) / sizeof(arr[0]);
for (i = 0; i < n; i++)
{
int term = arr[0];
for (j = 0; j < sz; j++)
{
arr[j] = arr[j + 1];
}
arr[sz] = term;
}
}
//解法2:以移动的步骤为界,逆置三次
void reverse_string(char *start, char *end)
{
while (start < end)
{
*start ^= *end;
*end ^= *start;
*start ^= *end;
start++;
end--;
}
}
void reverse(char arr[], int n)
{
int sz = sizeof(arr) / sizeof(arr[0]);
reverse_string(arr, arr + n - 1);
reverse_string(arr + n, arr + sz - 1);
reverse_string(arr, arr + sz - 1);
}
//解法三:将字符串复制一次收尾相接再裁去
void reverse_three(char *arr, int n)
{
int sz = sizeof(arr) / sizeof(arr[0]);
char *size = (char *)malloc(2 * sz + 1);
strcpy(size, arr);
strcat(size, arr);
strncpy(arr, size + n, 4);
free(size);
}
int main()
{
char arr[] = { "ABCD" };
printf("%s\n", arr);
int n = 0;
printf("输入需要左旋的个数:\n");
scanf("%d", &n);
/*code_turnleft(arr, n);*/
//reverse(arr, n);
reverse_three(arr, n);
printf("%s", arr);
printf("\n");
system("pause");
return 0;
}