左旋字符串的三种方法,并判断一个字符串是否为另外一个字符串旋转之后的字符串。(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;}}//循环结束,字符串不相等,返回0return 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("不是旋转后的结果");}}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ansible批量修改主机密码

在修改密码之前呢&#xff0c;请先明白一件事情 password 字段需要使用加密的密码&#xff0c;而不是明文密码 如果直接用剧本批量写入密码&#xff0c;会因为 密码哈希算法不匹配 导致登陆不成功 可以使用 Python 的 passlib 库来生成 SHA-512 加密的密码。&#xff08;根据使…

服务器入门

入门服务器管理涉及到一系列基础概念和技能&#xff0c;这包括操作系统、网络配置、安全性、远程访问等。以下是一些建议&#xff0c;可以帮助你开始学习服务器管理&#xff1a; ### 1. **选择合适的操作系统&#xff1a;** - 大多数服务器使用 Linux 操作系统&#xff0c;…

头歌C++语言之数学运算练习题(二)

目录 第1关:求商 任务描述 相关知识 算数运算符 编程要求 第2关:坐标与象限 任务描述 相关知识 if语句 if-else语句 编程要求 第3关:完全平方数 任务描述 编程要求 第4关:弹球的高度计算 任

java的版本分类--更新中

还需要对java的各版本以及springboot进行讨论论证。确定Java的版本使用选择要点与使用场景 一、Java的4个“儿子” 在了解什么是JavaEE之前&#xff0c;我们初学者有必要知道&#xff0c;JavaEE其实是一个平台&#xff0c;隶属Java开发语言的下肢&#xff0c;用最通俗的话说&…

西瓜书学习笔记——流形学习(公式推导+举例应用)

文章目录 等度量映射&#xff08;仅保留点与其邻近点的距离&#xff09;算法介绍实验分析 局部线性嵌入&#xff08;不仅保留点与其邻近点的距离还要保留邻近关系&#xff09;算法介绍实验分析 等度量映射&#xff08;仅保留点与其邻近点的距离&#xff09; 算法介绍 等度量映…

设计模式——七大原则

​更多内容&#xff0c;前往 IT-BLOG ​设计模式的目的是为了让程序&#xff0c;具有更好的代码重用性、可读性&#xff08;编程规范性&#xff0c;便于后期维护和理解&#xff09;、可扩展性&#xff08;当需要增加新需求时&#xff0c;非常方便&#xff09;、可靠性&#xf…

树莓派5一键安装C++版本OpenCV

安装环境 本人当前的安装环境&#xff1a; 树莓派5Raspberry Pi os (64-bit) Debian12 Bookworm 镜像下载地址 我这里是将镜像安装好后直接安装opencv&#xff0c;如果不是刚安装好的镜像需要注意是否有openCV的python之类的安装过&#xff0c;不然可能出现编译错误 一、扩展内…

SpringBoot中数据库的连接及Mybatis的配置和使用

目录 1 在pom.xml中引入相关依赖 2 对数据库进行配置 2.1 配置application.yml 2.2 idea连接数据库 (3.2.1有用到) 3 Mybatis的使用 3.1 测试文件的引入 3.2 使用 3.2.1 使用注解(有小技巧(✪ω✪)) 3.2.2 使用动态sql 1 在pom.xml中引入相关依赖 <dependencies&g…

海外多语言盲盒开发:打破语言障碍,连接全球消费者

随着全球化的加速和互联网的普及&#xff0c;语言障碍成为了影响跨国交流和商业活动的重要因素。为了满足跨国市场的需求&#xff0c;海外多语言盲盒开发成为了一个新兴的领域。本文将探讨海外多语言盲盒开发的意义、现状和未来发展。 一、海外多语言盲盒开发的意义 在全球化…

RedHat8.4安装邮件服务器

一、配置发件服务器 1.1 根据现场IP&#xff0c;配置主机名 vim /etc/hosts 192.168.8.120 mail.test.com 将主机名更改为邮件服务器域名mail.test.com 1.2 关闭防火墙&#xff0c;禁止开机启动 systemctl stop firewalld systemctl disable firewalld 1.3 关闭selinux v…

基于springboot就业信息管理系统源码和论文

随着信息化时代的到来&#xff0c;管理系统都趋向于智能化、系统化&#xff0c;就业信息管理系统也不例外&#xff0c;但目前国内仍都使用人工管理&#xff0c;市场规模越来越大&#xff0c;同时信息量也越来越庞大&#xff0c;人工管理显然已无法应对时代的变化&#xff0c;而…

InnoDB 锁系统(小白入门)

1995年 &#xff0c;MySQL 1.0发布&#xff0c;仅供内部使用&#xff01; 开发多用户、数据库驱动的应用时&#xff0c;最大的一个难点是&#xff1a;一方面要最大程度地利用数据库的并发访问&#xff0c;另一方面还要确保每个用户能以一致性的方式读取和修改数据。 MVCC 并发…

基于python+控制台的员工信息管理系统

基于python控制台的员工信息管理系统 一、系统介绍二、效果展示三、其他系统实现四、获取源码 一、系统介绍 1.添加职工数据 2.显示职工数据 3.查询职工数据 4.修改职工数据 5.删除职工数据 6.保存职工数据 7.排序职工数据 8.统计职工工资数据 9.退出 二、效果展示 三、其他系…

从搜索引擎到答案引擎:LLM驱动的变革

在过去的几周里&#xff0c;我一直在思考和起草这篇文章&#xff0c;认为谷歌搜索正处于被颠覆的边缘&#xff0c;它实际上可能会影响 SEO 作为业务牵引渠道的可行性。 考虑到谷歌二十多年来的完全统治地位&#xff0c;以及任何竞争对手都完全无力削弱它&#xff0c;坦率地说&…

CSS transition(过渡效果)详解并附带示例

CSS过渡效果&#xff08;CSS transitions&#xff09;是一种在元素属性值发生变化时&#xff0c;通过指定过渡效果来实现平滑的动画效果的方法。通过定义起始状态和结束状态之间的过渡属性&#xff0c;可以使元素的变化更加流畅和可视化。 过渡效果的基本语法如下&#xff1a;…

远程监控电脑软件会保存哪些记录?

远程监控电脑软件是一种功能强大的辅助工具&#xff0c;能够监控到各种各样的东西&#xff0c;常被企业用于管理员工。那么&#xff0c;远程监控电脑软件都会监控保存哪些记录呢&#xff1f; 一、网络活动 无论是浏览器访问记录、下载记录还是网络聊天记录&#xff0c;它都能…

疑惑问题总结

目录 问题总结 1. 布局为啥用不同盒子,我只想用div ? 2. 为啥用辣么多类名? 3. 到底用margin还是 padding ? 4. 自己做没有思路? 最后一定多运用辅助工具,比如屏幕画笔,ps等等 问题总结 1. 布局为啥用不同盒子,我只想用div ? 标签都是有语义的,合理的地方用合理的标…

乐意购项目前端开发 #6

一、商品详情页面 代码模版 创建Detail文件夹, 然后创建index.vue文件 <script setup> import { getDetail } from "/api/goods/index"; import { ref, onMounted } from "vue"; import { useRoute } from "vue-router"; import { useCar…

P8722 [蓝桥杯 2020 省 AB3] 日期识别--2024蓝桥杯冲刺省一

点击跳转例题 知识点&#xff1a;字符串总结 注意事项在代码中 #include <bits/stdc.h> #define int long long //(有超时风险) #define PII pair<int,int> #define endl \n #define LL __int128using namespace std;const int N2e610,M1e310,mod998244353,INF0x3f…

SpringBoot 登录检验JWT令牌 生成与校验

JWT官网 https://jwt.io/ 引入依赖 <dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.9.1</version> </dependency>设置过期时间 LocalDateTime localDateTime LocalDateTime.now().…