字符串旋转结果

本文介绍了strcmp,strncmp用于比较字符串,strstr用于查找子串,以及如何利用这些函数判断一个字符串是否是另一个字符串经过旋转得到的结果。通过示例展示了四种不同的方法,包括直接法、库函数应用和旋转检测算法。
摘要由CSDN通过智能技术生成

本题与之前的这道题类似,只不过是多了一点延展,比较字符串是否相同,按照之前那道题,一共有三种解法,详情见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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值