左旋字符串的三种方法,并判断一个字符串是否为另外一个字符串旋转之后的字符串。(strcpy,strncat,strcmp,strstr函数的介绍)

一.   实现一个函数,可以左旋字符串中的k个字符。
     

例如:
        ABCD左旋一个字符得到BCDA
        ABCD左旋两个字符得到CDAB 

         通过分析,可以知道实际的旋转次数,其实是k%(字符串长度)。假设一个字符串长度是3,那左旋4个字符后得到的字符串就是它本身。

1.直接旋转法

将字符串中的字符一个一个旋转

步骤:先定义一个变量tmp,将第一个字符赋值给这个变量,然后将后面的字符依次往前赋值,再将tmp的值赋值给最后一个字符

代码
#include<stdio.h>
#include<string.h>
//方法一
void Turnleft(char arr[6],int len,int k)
{
	int time = k % len;//实际旋转次数
	for (int i = 0; i < time; i++)
	{
		char tmp = arr[0];
		for (int j = 0; j < len-1; j++)
		{
			//交换			
			arr[j] = arr[j + 1];
		}
		arr[len - 1] = tmp;
	}
}
int main()
{
	char arr[] = "ABCDEF";
	int len = strlen(arr);
	int k = 2;//旋转次数
	Turnleft(arr, len, k);
	printf("%s", arr);
}

2.库函数法

介绍使用到的库函数:

1).strcpy(); 字符串拷贝

2).strncat(); 字符串拼接 ->n个

这两个函数传递的参数都是地址,即指针

1).strcpy函数:

char * strcpy ( char * destination, const char * source );

destination目的地,即要追加的目标字符串,source指复制的内容

复制字符串

指向的 C 字符串复制到目标指向的数组中,包括终止 null 字符(并在该点停止)

举例说明:

注意,该函数复制的字符串会覆盖原字符串

 2).strncat

char * strncat ( char * destination, const char * source, size_t num );

destination目的地,即要追加的目标字符串,source指追加的内容,num指追加字符的个数

从字符串中追加字符

的前 num 个字符附加到目标,以及终止 null 字符。
如果 source 中 C 字符串的长度小于 num,则仅复制直到终止 null 字符的内容

 举例说明:

 假设左旋"ABCDEF"这个字符串的两个字符,那么只需先复制后四个字符,然后再讲前两个字符拼接上去就行了

代码:
#include<stdio.h>
#include<string.h>
void Turnleft2(char arr[],int len,int k)
{
	int time = k % len;//实际旋转次数
	char tmp[100] = "0";
	strcpy(tmp, arr + time);//复制字符串,这里的arr是数组首元素的地址
	//arr + time 是数组第time+1个元素的地址
	strncat(tmp, arr, time);//拼接,time表示拼接的字符串个数
	strcpy(arr, tmp);//再把得到的新的字符串返回原数组
}
int main()
{
	char arr[] = "ABCDEF";
	int len = strlen(arr);
	int k = 2;//旋转次数
	
	Turnleft2(arr, len, k);
	printf("%s", arr);
}

 

 3.三段旋转法

 代码:
#include<stdio.h>
#include<string.h>
//三段旋转法
void ReverseRange(char* arr,int start,int end)//数组名是数组首元素的地址
{
	int left = start;
	int right = end;
	while (left < right)
	{
		char tmp = *(arr + left);//arr[left] = *(arr+left)
		*(arr + left) = *(arr + right);
		*(arr + right) = tmp;
		left++;
		right--;
	}
}
void Turnleft3(char* arr,int len,int k)
{
	int time = k % len;
	//三段旋转
	ReverseRange(arr, 0, time-1);
	ReverseRange( arr, time ,len-1 );
	ReverseRange( arr,0,len-1);
}
int main()
{
	char arr[] = "ABCDEF";
	int len = strlen(arr);
	int k = 2;//旋转次数
	
	Turnleft3(arr, len, k);
	printf("%s", arr);
}

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

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

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

AABCD左旋一个字符得到ABCDA

AABCD左旋两个字符得到BCDAA

AABCD右旋一个字符得到DAABC

解决这个题目,很重要的一个步骤就是如何判断两个字符串是否相同,我们可以通过每个字符的ASCII码值来比较 

strcmp函数

strcmp(cmp是compare的缩写)用来比较字符串的大小
比较的内容:ASCII码值
比较规则:一个一个字符去比较,先出现的不一样的字符的大小,就是整个字符串的大小

(例如,zbc>abcdef,abcdef>abc)
输出整数表示>(大于)
输出0,表示=(等于)
输出负数,表示<(小于)

1.旋转后再判断

直接用上面写过的函数进行旋转,然后比较字符串的大小

注:这里旋转函数的旋转次数,就是字符串长度-1

代码:
#include<stdio.h>
#include<string.h>
//方法一
int  Find_Turnleft(char arr1[6],char arr2[], int len)
{
	for (int i = 0; i < len; i++)
	{
		char tmp = arr1[0];
		for (int j = 0; j < len - 1; j++)
		{
			//交换			
			arr1[j] = arr1[j + 1];
		}
		arr1[len - 1] = tmp;
		if (strcmp(arr1,arr2)==0)
		{
			return 1;
		}
	}
	//循环结束,字符串不相等,返回0
	return 0;

}
int main()
{
	char arr1[] = "ABCDEF";
	char arr2[] = "CDEFAB";
	int len = strlen(arr1);	
	int ret = Find_Turnleft(arr1, arr2, len);
	if (ret == 1)
	{
		printf("是旋转后的结果");
	}
	else
	{
		printf("不是旋转后的结果");
	}
	
}

2.库函数法

将一段字符串拼接两次,那么它旋转后的结果一定能在这里面找到

介绍使用到的库函数

1).strstr函数
const char * strstr ( const char * str1, const char * str2 );
      char * strstr (       char * str1, const char * str2 );

str1要扫描的 C 字符串。

str2包含要匹配的字符序列的 C 字符串。

查找子字符串

返回指向 str1 中 str2 第一次出现的指针,如果 str2 不是 str1 的一部分,则返回 null 指针。
匹配过程不包括终止 null 字符,但到此为止。

举例介绍:

 代码:
#include<stdio.h>
#include<string.h>

//库函数法
int Find_Turnleft2(char arr1[6], char arr2[], int len)
{
	char tmp[100] = "0";
	strcpy(tmp, arr1);
	strncat(tmp, arr1, len);
	return strstr(tmp, arr2) != NULL;
	//表达式为假返回0,为真返回1
}
int main()
{
	char arr1[] = "ABCDEF";
	char arr2[] = "CDEFAB";
	int len = strlen(arr1);	
	int ret = Find_Turnleft(arr1, arr2, len);
	if (ret == 1)
	{
		printf("是旋转后的结果");
	}
	else
	{
		printf("不是旋转后的结果");
	}
	
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/372962.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

小白水平理解面试经典题目_数组类LeetCode 118 Pascal‘s Triangle【回归解法】

LeetCode 118 生成杨辉三角&#xff08;Pascal’s Triangle&#xff09; 小白渣翻译 给定一个非负整数 numRows&#xff0c;生成杨辉三角的前 numRows 行。 在杨辉三角中&#xff0c;每个数是它左上方和右上方的数的和。 例子 这里是小白理解 那么这种题目一上来看&#xf…

利用视图实现复杂查询

&#x1f497;wei_shuo的个人主页 &#x1f4ab;wei_shuo的学习社区 &#x1f310;Hello World &#xff01; 利用视图实现复杂查询 需求&#xff1a;需要对Excel表中导入的四列进行&#xff0c;精准查询&#xff08;搜索符合这四列的数据&#xff09;&#xff0c;并提供预览后…

c#cad 创建-文本(一)

运行环境 vs2022 c# cad2016 调试成功 一、代码说明 该代码是一个用于在AutoCAD中创建文本的命令。 首先&#xff0c;通过添加using语句引用了需要使用的Autodesk.AutoCAD命名空间。 然后&#xff0c;在命名空间CreateTextInCad下定义了一个名为CreateTextCommand的类&…

C# CAD交互界面-自定义窗体(三)

运行环境 vs2022 c# cad2016 调试成功 一、引用 二、开发代码进行详细的说明 初始化与获取AutoCAD核心对象&#xff1a; Database db HostApplicationServices.WorkingDatabase;&#xff1a;这行代码获取当前工作中的AutoCAD数据库对象。在AutoCAD中&#xff0c;所有图形数…

《动手学深度学习(PyTorch版)》笔记7.1

注&#xff1a;书中对代码的讲解并不详细&#xff0c;本文对很多细节做了详细注释。另外&#xff0c;书上的源代码是在Jupyter Notebook上运行的&#xff0c;较为分散&#xff0c;本文将代码集中起来&#xff0c;并加以完善&#xff0c;全部用vscode在python 3.9.18下测试通过&…

数据库学习笔记2024/2/5

2. SQL 全称 Structured Query Language&#xff0c;结构化查询语言。操作关系型数据库的编程语言&#xff0c;定义了 一套操作关系型数据库统一标准 2.1 SQL通用语法 在学习具体的SQL语句之前&#xff0c;先来了解一下SQL语言的通用语法。 1). SQL语句可以单行或多行书写&…

C语言中10种常见的字符串函数你都掌握了吗?

目录 ​编辑 1.strlen(字符串长度计算函数) 2.strcpy&#xff08;字符串拷贝函数&#xff09; 3.strcat&#xff08;字符串追加函数&#xff09; 4.strcmp&#xff08;字符串大小比较函数&#xff09; 5.strncpy&#xff08;有限制的字符串拷贝函数&#xff09; 6.strnca…

DevOps落地笔记-15|混沌工程:通过问题注入提高系统可靠性

上一课时介绍了通过搭建一套部署流水线&#xff0c;高效、可靠的将软件部署到测试环境以及生产环境。到目前为止&#xff0c;我们学习了从用户需求到软件部署到生产环境交付给用户的全过程。随着软件工程不断发展&#xff0c;近几年&#xff0c;出现了一种新的实践&#xff0c;…

[Angular 基础] - 指令(directives)

[Angular 基础] - 指令(directives) 这里假设已经知道如何创建 Angular 组件以及数据绑定&#xff0c;不然可以参考前两篇笔记&#xff1a; [Angular 基础] - Angular 渲染过程 & 组件的创建 [Angular 基础] - 数据绑定(databinding) 就像中文翻译一样&#xff0c;dire…

一文讲透ast.literal_eval() eval() json.loads()

文章目录 一文讲透ast.literal_eval() eval() json.loads()1. ast.literal_eval()2. eval()3. json.loads()4. 总结 一文讲透ast.literal_eval() eval() json.loads() 在Python库中&#xff0c;我们经常会遇到需要将字符串转换为相应对象或数据结构的情况。在这种情况下&#…

研究表明:论文被大V宣传后,引用次数暴涨2~3倍!

随着AI领域的迅猛发展&#xff0c;学术成果的传播方式发生了显著转变。 期刊审稿周期长&#xff0c;当你还在和审稿人battle时&#xff0c;方法先过时了。而会议虽然没有期刊长&#xff0c;但也有几个月的时间差&#xff0c;为了保护成果的创新性并扩大影响力&#xff0c;很多…

mysql-FIND_IN_SET查询优化

优化前 SELECTuser_id,user_name,real_name,PASSWORD,real_org_id,real_org_name,real_dept_id,real_dept_name, STATUS FROMsys_user WHEREis_del 0 AND find_in_set( lilong, login_user_account ) 优化后 SELECTuser_id,user_name,real_name,PASSWORD,real_org_id,real…

必须了解的mysql三大日志-binlog、redo log和undo log

背景 日志是 mysql 数据库的重要组成部分&#xff0c;记录着数据库运行期间各种状态信息。mysql日志主要包括错误日志、查询日志、慢查询日志、事务日志、二进制日志几大类。 作为开发&#xff0c;我们重点需要关注的是二进制日志( binlog )和事务日志(包括redo log 和 undo …

Linux应用开发---网络通信

Linux应用开发—网络通信 1 网络通信概述 Linux下的网络编程&#xff0c;我们一般称为 socket 编程&#xff0c;socket 是内核向应用层提供的一套网络编程接口&#xff0c;我们可以基于socket接口开发自己的网络相关应用程序。 1.1 socket 简介 套接字&#xff08;socket&…

ReentrantLock源码分析、LockSuppor、ReentrantReadWriteLock、锁优化的方法

ReentrantLock类图 我们看一下重入锁ReentrantLock类关系图&#xff0c;它是实现了Lock接口的类。NonfairSync和FairSync都继承 自抽象类Sync&#xff0c;在ReentrantLock中有非公平锁NonfairSync和公平锁FairSync的实现。 在重入锁ReentrantLock类关系图中&#xff0c;我们可以…

Rust-获取随机数练习案例

文章目录 前言一、取官网示例猜数字游戏玩一玩cargo checkTOML文件 二、完整代码总结 前言 Rust学习系列-获取随机数练习案例&#xff0c;基于cargo 进行案例练习&#xff0c;过程中会使用cargo check&#xff1b; cargo run&#xff1b;等命名&#xff0c;同时了解基础的let …

flask_django_python五金电商网络营销的可视化分析研究

前面部分完成了系统需求分析&#xff0c;了解到新闻数据业务方面的需求&#xff0c;系统主要分为用户管理、五金信息管理、在线留言、系统管理等功能。销的可视化研究&#xff0c;并对这些数据进行处理&#xff0c; 然后对这些数据进行可视化分析和统计。 Python 爬虫技术目前来…

linux免密登录的实现

ssh免密登录使用方便&#xff0c;关键没有了口令验证反倒规避了暴力破解或者被探测的风险。配置得当&#xff0c;使用ssh免密登录更加安全。在生产环境中应用和数据库服务器之间互相设置后使用方便&#xff0c;并且在第三方人员配置使用时不用告知对方密码。 第一步、ssh登录发…

如何在HA智能家居系统中添加HACS集成并实现异地控制家中苹果与小米设备

文章目录 基本条件一、下载HACS源码二、添加HACS集成三、绑定米家设备 ​ 上文介绍了如何实现群晖Docker部署HomeAssistant&#xff0c;通过内网穿透在户外控制家庭中枢。本文将介绍如何安装HACS插件商店&#xff0c;将米家&#xff0c;果家设备接入 Home Assistant。 基本条件…

第十三篇【传奇开心果系列】Python的OpenCV库技术点案例示例:光流估计

传奇开心果短博文系列 系列短博文目录Python的OpenCV库技术点案例示例:光流估计短博文目录前言一、光流估计介绍二、Lucas-Kanade光流介绍和示例代码三、Horn-Schunck光流介绍和示例代码四、cv::calcOpticalFlowPyrLK()函数实现光流估计介绍和示例代码五、光流估计用于运动分析…