常用方法左旋字符串
#include<stdio.h>
#include<Windows.h>
#include<assert.h>
#pragma warning(disable:4996)
void left_move(char str[], int len, int steps)
{
assert(str);
assert(len > 0);
assert(steps > 0);
steps %= len;
while (steps-- > 0)
{
char tmp = str[0];
int i = 0;
for (i = 0; i < len; i++)
{
str[i - 1] = str[i];
}
str[i - 1] = tmp;
}
}
int main()
{
char msg[] = "abcde12345";
printf("Please Enter:");
int num = 0;
scanf("%d", &num);
printf("before:%s\n", msg);
left_move(msg, strlen(msg), num);
printf("after:%s\n", msg);
system("pause");
return 0;
}
为了使程序简便,将字符串进行拷贝并与字符串相连接,组成一个新的字符串,将 abcde12345 变为 abcde12345abcde12345 ,然后将新形成的字符串左移 k%len 个字符,然后在在左移后的字符串中取相同长度的字符,该字符即为左旋 k 个字符的字符串。
#include<stdio.h>
#include<Windows.h>
#include<assert.h>
#pragma warning(disable:4996)
void left_move(char str[], int len, int steps)
{
assert(str);
assert(len > 0);
assert(steps > 0);
steps %= len;
int new_len = 2 * len + 1;
char *new_str = (char *)malloc(new_len);
strcpy(new_str, str);
strcat(new_str, str);
strncpy(str, new_str + steps, len);
free(new_str);
}
int main()
{
char msg[] = "abcde12345";
printf("Please Enter:");
int num = 0;
scanf("%d", &num);
printf("before:%s\n", msg);
left_move(msg, strlen(msg), num);
printf("after:%s\n", msg);
system("pause");
return 0;
}