C语言初阶习题【31】字符串旋转结果

1. 题目描述——字符串旋转结果

写一个函数,判断一个字符串是否为另外一个字符串旋转之后的字符串。

例如:给定s1 =AABCD和s2 = BCDAA,返回1

给定s1=abcd和s2=ACBD,返回0.

AABCD左旋一个字符得到ABCDA

AABCD左旋两个字符得到BCDAA

AABCD右旋一个字符得到DAABC

2. 思路

  1. 最直接的就是把字符串每左旋一次就比较一次
  2. 一个巧妙思路:给第一个字符串后面再追加一个本字符串,然后判断,第二个字符串是否是第一个字符串的子串(注意要先确定两个字符串个数是否相同,不同就直接返回0了)
    在这里插入图片描述

库函数——strcat()
在这里插入图片描述

库函数——sterncat()
在这里插入图片描述

库函数——strstr()
在这里插入图片描述

3. 代码实现1——每左旋一次,就进行比较

//判断一个字符串是否是另一个字符串左旋得到的
#include<stdio.h>
#include<string.h>
void leftStr(char str[], int size, int num)
{
	char tem = str[0];
	int i = 0;
	for (i = 0; i < size; i++)
	{
		str[i] = str[i + 1];
	}
	str[size - 1] = tem;
}

int  com(char str1[],char  str2[])
{
	int size1 = strlen(str1);
	int size2 = strlen(str2);
	if (size1 != size2)
	{
		return 0;
	}
	int i = 0;
	for (i = 0; i < size1; i++)
	{
		leftStr(str1, size1, 1);  //每次左旋1 个字符,注意这里不是i
		if (strcmp(str1, str2) == 0)
		{
			return 1;
		}
	}
	return 0;
}

int main()
{
	char str1[] = "AABCD";
	char str2[] = "BCDAA";

	int ret = com(str1, str2);
	if (ret == 1)
	{
		printf("yes!\n");
	}
	else
	{
		printf("no!\n");
	}
	return 0;
}

在这里插入图片描述

4.代码实现2——巧妙思路

在本身基础上追加字符串的时候,我原本是在传入的字符串后面直接追加了自己,然后程序直接报错栈错误

strncat(str1, str1, size1); 

在这里插入图片描述
分析:这个地方不能这样写,我们的str1是固定的大小,不能去追加到自身身上, 就是原本arr1传参给str1的时候空间就是固定的了,容纳不了加上的这个strncat加上的大小导致栈崩溃
所以这里我重新创建了一个空间比较大的str3,用它接收我们追加的字符串,然后和str2进行比较。

#define _CRT_SECURE_NO_WARNINGS 1
//判断一个字符串是否是另一个字符串左旋得到的2
#include<stdio.h>
#include<string.h>
int cmpStr(char str1[], char  str2[])
{
	int size1 = strlen(str1);
	int size2 = strlen(str2);
	if (size1 != size2)
	{
		return 0;
	}
	char str3[20] = " "; //这里试了下,最小需要设置为str3[11] 、str[10]的时候就报错,目前我的理解,是因为字符串的最后面还需要一个'\0’ 所以要给它留11个空间
	int i = 0;
	for (i = 0; i < size1; i++)
	{
		str3[i] = str1[i];
	}
	strncat(str3, str1, size1);
	//strncat(str1, str1, size1);//这个地方不能这样写,你的str1是固定的大小,不能去追加到自身身上,
	// 就是原本arr1传参给str1的时候空间就是固定的了5个空间大小,容纳不了你加上的这个strncat加上的大小(10个大小)导致栈崩溃
	
	if (strstr(str3, str2) != NULL)
		return 1;
	else
		return 0;
}


int main()
{
	char arr1[] = "AABCD";
	char arr2[] = "BCDAA";
	int ret = cmpStr(arr1, arr2);
	if (ret == 1)
	{
		printf("yes!\n");
	}
	else
	{
		printf("no!\n");
	}
	return 0;
}

在这里插入图片描述

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值