题目:实现一个函数,可以左旋字符串中k个字符
例如ABCD左旋一个字符得到BCDA;
ABCD左旋两个字符得到CDAB;
方法一:string库
一:strcpy
函数用于将一个字符串复制到另一个字符串中。原型:char *strcpy(char *dest, const char *src);
参数:
dest
:目标字符串,接收复制的内容,必须有足够的空间来存放源字符串。src
:源字符串,待复制的字符串。二:
strncat
函数用于将一个字符串的前n
个字符追加到另一个字符串的末尾。原型:char *strncat(char *dest, const char *src, size_t n);
参数:
dest
:目标字符串,接收追加的内容,必须有足够的空间来存放源字符串和原有内容。src
:源字符串,待追加的字符串。n
:要追加的字符数。
#include<stdio.h>
#include<string.h>
void leftround(char* str,int time)
{
int len = strlen(str);
char tmp[100] = { 0 };
strcpy(tmp, str + time);//先将不用左旋的字符复制到tmp临时字符数组中;
strncat(tmp, str, time);//将要左旋的time个字符粘贴到tmp临时字符数组的末尾;
strcpy(str, tmp);将tmp临时字符数组复制到str字符数组中;
}
int main()
{
char str[] = "abcdefg";
int n = 0;
scanf("%d", &n);
int time = n % strlen(str);左旋的次数,如果字符为5个,左移六次相当于左移1次 leftround(str,time);
printf("%s", str);
}
方法二 :循环
#include<stdio.h>
#include<string.h>
void leftround(char* str, int time)
{
int len = strlen(str);//求字符串长度
for (int i = 0; i < time; i++)//左旋time个字母,循环time次
{
char tmp = str[0];//每次将第一个左旋的字母存放到临时变量tmp中
int j = 0;
for (; j < len - 1; j++)
{
str[j] = str[j + 1];//每次将未轮到左旋的字母依次上移一位;
}
str[j] = tmp;//末尾放置tmo变量,即每次第一个左旋的字母;
}
}
int main()
{
char str[] = "abcdefg";
int n = 0;
scanf("%d", &n);
int time = n % strlen(str);
leftround(str,time);
printf("%s", str);
}
方法三:三次逆置字符串;
例如abcd左旋两位;
思路:逆序字符串三次:
1:ab->ba
2: cd->dc
3:badc->cdab
#include<stdio.h>
#include<string.h>
void reverse(char* str, int a, int b)//逆置字符串函数,将下标a到b的字符全部逆置
{
while (a < b)
{
char tmp = str[a];
str[a] = str[b];
str[b] = tmp;
a++;
b--;}
}
void leftround(char* str, int time)
{
int len = strlen(str);
reverse(str, 0, time - 1);
reverse(str, time, len - 1);
reverse(str, 0, len - 1);
}
int main()
{
char str[] = "abcdefg";
int n = 0;
scanf("%d", &n);
int time = n % strlen(str);
leftround(str,time);
printf("%s", str);
}