//判断是否为旋转所得字符串
#include<stdio.h>
#include<string.h>
//方法二:
int is_move_or_not1(char* p1, char* p2)
{
char* arr = strncat(p1, p1, 6);
if (strstr(arr, p2) == NULL)
{
return 0;
}
else
return 1;
}
//方法一中的逐个移动
void left_move(char* ps)
{
int len = (int)strlen(ps);
char tmp = ps[0];
for (int i = 0; i < len-1; i++)
{
ps[i] = ps[i + 1];
}
ps[len-1] = tmp;
}
//方法一:
int is_move_or_not(char* ptr1, char* ptr2)
{
int len = (int)strlen(ptr1);
for (int i = 0; i < len; i++)
{
left_move(ptr1);
if (strcmp(ptr1, ptr2) == 0)
{
return 1;
}
}
return 0;
}
int main()
{
char arr1[] = "abcdef";
char arr2[] = "defabc";
//首先如果两个字符串长度不相等,一定不可能是由另一个字符串旋转得来。
if (strlen(arr1) != strlen(arr2))
{
printf("不是旋转得来的\n");
return 0;
}
//第一种比较方式:
int ret = is_move_or_not(arr1, arr2);
if (ret == 1)
{
printf("是旋转得来的\n");
}
else if (ret == 0)
{
printf("不是旋转得来的\n");
}
char arr3[20] = "abcdef";
char arr4[] = "defabc";
//第二种比较方式:
ret = is_move_or_not1(arr3, arr4);
if (ret == 1)
{
printf("是旋转得来的\n");
}
else if(ret == 0)
{
printf("不是旋转得来的\n");
}
return 0;
}
判断一个字符串是否由另一个字符串旋转而来共分两种思路:
第一种方式是:逐个比较法; 另一种方式是:库函数法。
逐个比较法:
对于逐个比较法的基本思路就是在函数内部加入一个循环,循环内部封装一个函数,每经过一次整个函数,模板字符串将整体左移一位。
每次进行完左移操作,都与判断的字符串进行比较,一旦成功则返回1;如果一次都没有成功,则顺次来到for的外部,并返回0;
以上面的机制从而得到我们想要的结论。
库函数法:
这种方法里,我们使用库函数strstr与strncat(#include<string.h>)
strstr:用于在一个字符串中查找另一个字符串,找到了返回首次出现的地址;找不到返回空指针。
strncat:这用于字符串的连接,但与strcat不同的是strncat可以指定字符的进行连接(strcat函数不可以连接自己,而strncat函数可以做到这一点。在本文中即利用的这一优势)
利用不同库函数的不同功能,我们从而得到我们想要的结论。