本题与之前的这道题类似,只不过是多了一点延展,比较字符串是否相同,按照之前那道题,一共有三种解法,详情见http://t.csdnimg.cn/G8DRJ
与此同时还有新的一种解法:采用库函数strstr
知识点:
strcmp:比较字符串的大小关系
使用方法 :strcmp(char* ch1,char* ch2),意思就是比较ch1和ch2的大小,其返回值一共有三种情况
一:如果ch1和ch2相等,则返回0
二:如果ch1大于ch2,则返回正整数值
三:如果ch1小于ch2,则返回负整数值
其头文件为#include<string.h>
与strcpy(拷贝)对应strncpy ,strcat(拼接)对应strncat一样,也有对应另外的函数:strncmp
strncmp(char* ch1,char* ch2,int n),意思就是比较ch1的前n个字符和ch2的前n个字符的大小,其返回值规则与strcmp一样
注:字符串大小比较法则
从字符串的第一个字符开始比较其对应的ASCII码值,如果比较出了大小,后面的字符一律不用管。如果前面都相同,但是字符串长度不同,则较长的更大(也就是相当于较短的字符串拿出的ASCII码值为0,而较长的字符串拿出的任意一个字符对应的ASCII码值都大于0)
例如:
一:ch1="abcde" 和ch2="abcde"
因为一模一样,所以属于相等的情况
二:ch1="abcde" 和ch2="abdaa"
因为第一个和第二个字符都是相同的(ab),到了第三个字符出现了不同,其中c的ASCII码值小于d的ASCII码值,就已经说明ch2大于ch1,即使ch2后面的aa都比ch1的de小,也还是ch2更大
以及ch1="abcde" 和ch2="abcdef"
虽然前面五个字符一模一样,但是ch2更长(相当于ch1在第六个字符的比较中拿出了ASCII码值为0,但ch2在第六个字符的比较中拿出来 f 的ASCII码值,一定是比0大的),所以ch2更大
strstr:字符串查找
使用方法:strstr(char* ch1,char* ch2),意思就是在ch1中查找ch2,如果找到,就返回ch1中ch2对应的起始地址直到ch1结尾,如果没找到,就返回空指针null(也就是说strstr返回值类型为指针)
其头文件为#include<string.h>
例如:
ch1="ABCDE", ch2="BCD"
此时char*p=strstr(ch1,ch2),打印p,就会打印BCDE
如果ch1="ABCDE", ch2="BCDF"
此时char*p=strstr(ch1,ch2),打印p,就会打印(NULL)
方法一(直接法):
#include<stdio.h>
#include<string.h>
int func(char* ch, char*ch1)
{
int len = strlen(ch);
int time = len;
int i = 0, j = 0;
for (i = 0; i < time; i++) //左旋次数
{
for (j = 0; j < len - 1; j++) //交换的对数
{
char tmp = ch[j];
ch[j] = ch[j + 1];
ch[j + 1] = tmp;
}
if (strcmp(ch, ch1) == 0) //如果这一次左旋后一样
{
return 1;
}
else if(strcmp(ch,ch1)!=0 && i==time-1) //如果最后一次左旋还是不一样
{
return 0;
}
}
}
int main()
{
char ch[] = "AABCD";
char* ch1 = "CDAAB";
int ret = func(ch, ch1);
if (ret == 1)
{
printf("是\n");
}
else
{
printf("不是\n");
}
return 0;
}
方法二(strcpy这一类的库函数):
#include<stdio.h>
#include<string.h>
int func(char* ch, char* ch1)
{
int len = strlen(ch);
int time = len;
int i = 0;
for (i = 0; i < time; i++) //左旋次数
{
char tmp[10];
strcpy(tmp, ch + i);
strncat(tmp, ch, i);
if (strcmp(tmp, ch1) == 0)
{
return 1;
}
else if (strcmp(tmp, ch1) != 0 && i == time - 1)
{
return 0;
}
}
}
int main()
{
char ch[] = "AABCD";
char* ch1 = "CDAAB";
int ret = func(ch, ch1);
if (ret == 1)
{
printf("是\n");
}
else
{
printf("不是\n");
}
return 0;
}
方法三(三次逆序):
#include<stdio.h>
#include<string.h>
void nixu(char* ch, int start, int end)
{
int left = start;
int right = end;
while (left < right)
{
char tmp = ch[left];
ch[left] = ch[right];
ch[right] = tmp;
left++;
right--;
}
}
int func(char* ch, char* ch1)
{
int len = strlen(ch);
int time = len;
int i = 0;
for (i = 0; i < time; i++) //左旋次数
{
char tmp[10] = { 0 };
strcpy(tmp, ch);
nixu(tmp, 0, i);
nixu(tmp, i + 1, len - 1);
nixu(tmp, 0, len - 1);
if (strcmp(tmp, ch1) == 0)
{
return 1;
}
else if (strcmp(tmp, ch1) != 0 && i == time - 1)
{
return 0;
}
}
}
int main()
{
char ch[] = "AABCD";
char* ch1 = "CDAAB";
int ret = func(ch, ch1);
if (ret)
{
printf("是\n");
}
else
{
printf("不是\n");
}
return 0;
}
方法四(采用库函数strstr):
所以strstr的返回值如果不为null,则说明BCDAA是AABCD的旋转后的结果,如果是null,则说明BCDAA不是AABCD的旋转后的结果
答案:
#include<stdio.h>
#include<string.h>
int func(char* ch, char* ch1)
{
char tmp[100] = { 0 };
strcpy(tmp, ch); //先拷贝一份
strcat(tmp, ch); //再拼接一份
char* p = strstr(tmp, ch1);
if (p != NULL)
{
return 1;
}
else
{
return 0;
}
}
int main()
{
char ch[] = "AABCD";
char* ch1 = "CDAAB";
int ret = func(ch, ch1);
if (ret)
{
printf("是\n");
}
else
{
printf("不是\n");
}
return 0;
}