1.题目
实现一个函数,可以左旋字符串中的k个字符。
ABCD左旋一个字符得到BCDA
ABCD左旋两个字符得到CDAB
2.程序代码
方法一:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <Windows.h>
void left_move(char arr[7], int num, int sz)//自定义函数,实现题目要求
{
int i = 0;
int j = 0;//定义参数,控制循环
char mid = 0;//定义参数作为中间量
while (num >= sz)//如果要移动的位数大于等于字符串长度,执行此操作
{
if (num > sz)
{
num = num % sz;//若大于则对该数模上字符串长度取余
}
else
{
return 0;//如果相等的话,则字符串本身和移动后的结果相同
}
}
while (j < num)//控制移动的位数
{
mid = arr[0];//把第一个元素的值赋给中间量
i = 0;//每次进到循环都要给i初始化
while (i < sz - 1)//i不能超过字符串的长度-1
{
arr[i] = arr[i + 1];//把后一个元素的内容赋给前一个元素
i++;
}
arr[sz - 1] = mid;
j++;
}
return 0;
}
int main()
{
char arr[] = "ABCDEF";
int num = 0;
int sz = sizeof(arr) / sizeof(arr[0]) - 1;
printf("please input the number of moves:\n");
scanf("%d", &num);
left_move(arr, num, sz);
printf("%s", arr);
system("pause");
return 0;
}
方法二:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <Windows.h>
#include <string.h>
void change(char *l, char *r)//自定义函数,逆置字符串中的元素
{
int mid = 0;
while (l <= r)
{
mid = *l;
*l = *r;
*r = mid;
l++;
r--;
}
}
void left_move(char arr[], int num)
{
int len = strlen(arr);//求字符串长度
change(arr, arr + num - 1);//逆置要左移的元素
change(arr + num, arr + len - 1);//逆置其余的元素
change(arr, arr + len - 1);//把分别逆置后的字符串再次逆置
}
int main()
{
char arr[] = "ABCDEF";
int num = 0;
printf("please input the number of move:");
scanf("%d", &num);
left_move(arr, num);
printf("%s", arr);
system("pause");
return 0;
}