//判断是否为旋转所得字符串 #include#include //方法二: 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
strstr:用于在一个字符串中查找另一个字符串,找到了返回首次出现的地址;找不到返回空指针。
strncat:这用于字符串的连接,但与strcat不同的是strncat可以指定字符的进行连接(strcat函数不可以连接自己,而strncat函数可以做到这一点。在本文中即利用的这一优势)
利用不同库函数的不同功能,我们从而得到我们想要的结论。



