题目:

       断一个字符串是否为另外一个字符串旋转之后的字符串。例如:给定s1 = abcdef和s2 = cdefab,返回1,给定s1=abcd和s2=ACBD,返回0.

abcdef左旋一个字符得到bcdefa

abcdef左旋两个字符得到cdefab

 

abcdef右旋一个字符得到fabcde

abcdef右旋两个字符得到efabcd


题目分析:

      根据这个题目,我们能够和字符串的左旋和右旋联系起来,如果把给定的字符串拷贝一份放在给定字符串之后,例如:给定字符串abcdef,经过拷贝后得到字符串abcdefabcdef,观察这个字符串,能够发现给定的字符串abcdef经过左、右旋的所有情况为字符串abcdefabcdef的子串,则问题转换为判断另一个字符串是否是字符串abcdefabcdef的子串。整个问题可以借助两个库函数解决,下面为具体的程序:


#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
int main()
{
     char arr[20] = "abcdef";
     char *p = "bcdefa";
     char *ret = NULL;
     strncat(arr, arr, strlen(arr));   
     ret = strstr(arr, p);
     if(ret != NULL)
     {
         printf("OK\n");
      }
     else
     {
         printf("NO\n");
     }
system("pause");
return 0;
 
}

下面说明一下strncat和strstr的具体功能:


    strncat函数: 

头文件:#inclue <string.h>

strncat()用于将n个字符追加到字符串的结尾,其原型为:
    char * strncat(char *dest, const char *src, size_t n);

【参数说明】dest为目标字符串,src为源字符串,n为要追加的字符的数目。

strncat()将会从字符串src的开头拷贝n 个字符到dest字符串尾部,dest要有足够的空间来容纳要拷贝的字符串。如果n大于字符串src的长度,那么仅将src全部追加到dest的尾部。

       strncat()会将dest字符串最后的'\0'覆盖掉,字符追加完成后,再追加'\0'。   

【返回值】返回字符串dest。


      strstr函数: 

      包含文件:string.h     

      函数原型:extern char *strstr(char *str1, char *str2);  

 

    【功能】找出str2字符串在str1字符串中第一次出现的位置(不包括str2的串结束符)。   

    【返回值】返回该位置的指针,如找不到,返回空指针。