一, 旋转字符串分左旋转和右旋转,但是他们的算法基本相同。
1.左旋字符串,第一种方法,大家一般是第一思维
#include<stdio.h>
#include<math.h>
#include<assert.h>
void LeftX(char *lp,int num) //num 是旋转几个字符
{
int a = 0;
int b = strlen(lp);
assert(lp!=NULL);
while(a<num)
{
char *cur = lp;
char tmp = *lp; //建一个临时变量存放首指针的内容
while((*(cur+1))!='\0') //后面那个指针指向的内容为‘\0’的话停止
{
*cur=*(cur+1);
cur++;
}
*( cur)=tmp;
a++;
}
}
int main()
{
int num = 0;
int len = 0;
char arr[20]="ABCDEF";
len = strlen(arr);
printf("please input number:");
while(1)
{
scanf("%d",&num);
if(num>len)
{
printf("error");
}
else
LeftX(arr,num);
printf("%s\n",arr);
break;
}
return 0;
}
2. 第二种算法 (左旋,右旋基本类似,不在重复)
三步翻转法:1.旋转需要旋转的前几个字符
2.旋转后几个字符
3.整体旋转
#include<stdio.h>
#include<math.h>
void reverse(char *str,char *cur)
{
while(str<cur)
{
char tmp =*str;
*str=*cur;
*cur= tmp;
str++;
cur--;
}
}
void left_move(char *p,int num)
{
int a = strlen(p);
reverse(p,p+num-1);
reverse(p+num,p+a-1);
reverse(p,p+a-1);
}
int main()
{
char arr[]= "ABCDEF";
int num = 0;
printf("please input:");
scanf("%d",&num);
left_move(arr,num);
printf("%s",arr);
return 0;
}
二,判断一个字符串是否为另外一个字符串旋转之后的字符串。
可以用库函数里的strncat和strstr,这里是我自己写的。
#include<stdio.h>
#include<math.h>
#include<assert.h>
#include<windows.h>
int my_strlen(char const*str) // const 修饰的 *str 指针所指向的内容不能改变
{
int count = 0;
assert(str!=NULL); //断言一下,str不能是空指针,不然程序会崩溃
while(*str++)
{
count++;
}
return count;
}
void my_strncat(char *dst,char*str1,int len)
{
assert(dst!=NULL);
assert(str1!=NULL);
while(*dst)
{ dst++;
}
while(len--)
{
*dst++ = *str++;
}
*dst='\0';
char * my_strstr(char *str,char *p)
{
char * cur=str;
assert(str!=NULL);
assert(p!=NULL):
while((*cur)!='\0')
{
char *current=cur;
char *ret=p;
while(*current==*ret)
{
current++;
ret++;
if((*ret)=='\0')
return cur;
}
cur++;
}
return NULL;
}
int is_move(char*str,char *p)
{
int len =my_strlen(str);
int a = my_strlen(p);
char *p1=NULL;
assert(str!=NULL);
assert(p!=NULL);
my_strncat(str,str,len);
p1= my_strstr(str,p);
if(a!=len)
{
return 0;
}
if(p1!=NULL)
return 1;
return 0;
}
int main()
{
int ret = 0;
char arr[20]="ABCDEF";
char*p = "DEAFBC";
ret = is_move(arr,p);
if(ret == 0)
{
printf("not remove\n");
return 0;
}
else
printf("move\n");
system("pasuse");
return 1;
}}
好了,就到这里了,有什么问题可以给我留言哦