左旋字符串的三种方法,并判断一个字符串是否为另外一个字符串旋转之后的字符串。(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.hqwc.cn/news/452973.html

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

相关文章

Unity_修改天空球

Unity_修改天空球 Unity循序渐进的深入会发现可以改变的其实很多&#xff0c;剖开代码逻辑&#xff0c;可视化的表现对于吸引客户的眼球是很重要的。尤其对于知之甚少的客户&#xff0c;代码一般很难说服客户&#xff0c;然表现确很容易。 非代码色彩通才&#xff0c;持续学习…

PyTorch 2.2 中文官方教程(十七)

&#xff08;Beta&#xff09;使用缩放点积注意力&#xff08;SDPA&#xff09;实现高性能 Transformer 原文&#xff1a;pytorch.org/tutorials/intermediate/scaled_dot_product_attention_tutorial.html 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 注意 点击这…

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

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

前端面试题——Vue的双向绑定

前言 双向绑定机制是Vue中最重要的机制之一&#xff0c;甚至可以说是Vue框架的根基&#xff0c;它将数据与视图模板相分离&#xff0c;使得数据处理和页面渲染更为高效&#xff0c;同时它也是前端面试题中的常客&#xff0c;接下来让我们来了解什么是双向绑定以及其实现原理。…

笔记本电脑的WIFI模块,突然不显示了,网络也连接不上

问题复现&#xff1a; 早上&#xff0c;在更新完笔记本电脑的系统之后&#xff0c;连网之后&#xff0c;网络突然直接断开&#xff0c;一查看&#xff0c;WiFi模块居然不见了&#xff0c;开机重启也是如此&#xff0c;这种情况常常出现在更新系统之后&#xff0c;WiFi模块驱动就…

hdfs datanode数据分布不均调整(hdfs balancer )

Hadoop集群Datanode数据倾斜&#xff0c;个别节点hdfs空间使用率达到95%以上&#xff0c;于是新增加了三个Datenode节点&#xff0c;由于任务还在跑&#xff0c;数据在不断增加中&#xff0c;这几个节点现有的200GB空间估计最多能撑20小时左右&#xff0c;所以必须要进行balanc…

【Elasticsearch】从入门到精通

目前java常见的针对大数据存储的方案并不多&#xff0c;常见的就是mysql的分库分表、es存储 这里偏向es存储方案&#xff0c;es不同的版本之间其实差异还挺大的&#xff0c;本篇博文版本Elasticsearch 7.14.0 Springboot整合Easy-Es Easy-Es官方文档 Elasticsearch的初步认识 …

【操作系统·考研】磁盘和固态磁盘

1.磁盘 1.1 概述 磁盘(Disk)是由表明涂有磁性物质的物理盘片&#xff0c;通过一个称为磁头的导体线圈从磁盘存取数据。 在读/写期间&#xff0c;磁头固定&#xff0c;下面的磁盘在高速旋转。 磁盘是可共享设备(分时共享)&#xff0c;是指某段时间内可以有多个用户进行访问&a…

Sklearn、TensorFlow 与 Keras 机器学习实用指南第三版(六)

原文&#xff1a;Hands-On Machine Learning with Scikit-Learn, Keras, and TensorFlow 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 第十四章&#xff1a;使用卷积神经网络进行深度计算机视觉 尽管 IBM 的 Deep Blue 超级计算机在 1996 年击败了国际象棋世界冠军…

从零开始 TensorRT(4)命令行工具篇:trtexec 基本功能

前言 学习资料&#xff1a; TensorRT 源码示例 B站视频&#xff1a;TensorRT 教程 | 基于 8.6.1 版本 视频配套代码 cookbook 参考源码&#xff1a;cookbook → 07-Tool → trtexec 官方文档&#xff1a;trtexec 在 TensorRT 的安装目录 xxx/TensorRT-8.6.1.6/bin 下有命令行…

Linux Shell命令系列--basename获取基本文件名

一、目的 学习linux shell编程的第一步就是熟悉linux的各种命令的使用&#xff0c;本篇开始逐次介绍一些常用linux shell命令。 今天我们来讲解basename命令的使用。 二、介绍 1、基本概念 basename命令首先去除字符串末尾多余的斜杠&#xff08;如果有的话&#xff09;&#…

Java代码实现基数排序算法(附带源码)

基数排序是一种非比较型整数排序算法&#xff0c;其原理是将整数按位数切割成不同的数字&#xff0c;然后按每个位数分别比较。由于整数也可以表达字符串&#xff08;比如名字或日期&#xff09;和特定格式的浮点数&#xff0c;所以基数排序也不是只能使用于整数。 1. 基数排序…