【C语言】字符串左旋(三种方法)

(方法3只给出思路参考)

问题

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

例如:

ABCD左旋一个字符得到BCDA

ABCD左旋两个字符得到CDAB

分析

 我们先来理解一下,什么叫“左旋”?其实是这个意思:

由于没有规定左旋次数限制,我们还要注意的是,左旋4次后又变回原来的字符顺序了。所以左旋5次相当于左旋1次。(这样可以优化我们的代码)

在搞清楚这点后,我们才应该开始想具体的左旋代码怎么写。

方法1

我们一次旋一个,把旋几个当成旋几次

那么现在旋一次要怎么写呢?

首先,我们创建一个临时变量,把第一个字符赋给它;

其次,让后面的字符依次向前移动一位;

最后,把临时变量的字符赋给字符串的最后一个位置。

参考代码:

#include<stdio.h>
#include<string.h>
void zuo(char str[],int num)
{int len = strlen(str);num = num % len;//优化//假如ABCD旋5次,就变为旋5%4即1次while (num--)//旋num次{//我们就不要左旋几个一次操作几个了,而是当作次数。每次就旋一个。char tmp = str[0];//把后一个赋前一个,就可以实现往前移int i = 0;while (i < len - 1)//如果是len,i最大取值len-1,但是i+1取到len,str[len]越界了{str[i] = str[i + 1];i++;}//此时i为len-1,str[i]为最后一个字符str[i] = tmp;//注意不要错写成str[i+1]=tmp;}
}
int main()
{char str[50];scanf("%s", str);int num;scanf("%d", &num);//把要旋的次数传过去zuo(str,num);printf("%s\n", str);return 0;
}

提示:printf() 输出字符串时,会从第 0 个元素开始往后检索,直到遇见’\0’才停止,然后把’\0’前面的字符全部输出,这就是 printf() 输出字符串的原理。)

运行效果: 

 方法2

使用strcpy和strncat

现在我们就不将旋几个看为旋几次了,而是直接要旋几个就一次性旋几个,而要达到这一效果我们就不得不使用到函数strcpy和strcat。

实现逻辑就是我们创建一个临时数组:char tmp[50];把左旋字符以外的后面的字符先拷贝进tmp,再将要左旋的字符拼接到tmp后面,此时得到的tmp就是左旋后的字符数组,我们再将其拷贝回str。

那么在写代码前先来关心一下我们的strcpy和strcat:

前一个参数是目标地址,后一个参数是源地址。也就是说前一个参数是指向我们要拷贝到的字符数组,后一个参数被拷贝的字符串。

 

strcat的参数看起来和strcpy一样,前一个也是char* destination 后一个也是char* source,但前一个参数指向的是要被拼接的字符数组,后一个参数指向的是拼接物。

(图示)

 

但是我们会注意到strcat会把作为source的字符串整个拼接到destination,而对于本题目而言,我们只想拼接我们左旋个数的字符,假如我们要对ABCD左旋2个,在把字符CD拷贝进tmp之后我们需要再将AB拼接到tmp后面,如果写的是strcat(tmp,str);那么会变成CDABCD:

所以我们应该使用的是strncat函数,可以按我们拼接我们想要的个数。

 

区别就是,strncat(tmp,str,num);会将str开始的num个字符拼接到tmp的末尾处。 

 了解怎么调用后,我们就可以写我们的代码了:

这就是我们的方法2。

 

方法3

到此,本文就结束了,祝阅读愉快^_^ 

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

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

相关文章

d2-crud-plus 使用小技巧(六)—— 表单下拉选择 行样式 溢出时显示异常优化

问题 vue2 elementUI d2-crud-plus&#xff0c;数据类型为select时&#xff0c;行样式显示为tag样式&#xff0c;但是如果选择内容过长就会出现下面这种bug&#xff0c;显然用户体验不够友好。 期望 代码 js export const crudOptions (vm) > {return {...columns:…

QT 如何在 QListWidget 的选项中插入自定义组件

有时我们需要 QListWidget 完成更复杂的操作&#xff0c;而不仅限于添加文本或者图标&#xff0c;那么就会使用到 setItemWidget 函数&#xff0c;但是这也会伴生一个问题&#xff0c;插入自定义组件后&#xff0c;QListWidget 对选项点击事件的获取会收到阻塞&#xff0c;因…

QT 使用信号和槽,让QLabel的内容实时与QLineEdit同步,类似vue框架的双向绑定

在窗口里放置一个单行文本编辑器&#xff08;QLineEdit&#xff09;和一个标签控件&#xff08;QLabel&#xff09;&#xff0c;实现的效果就是当编辑器的内容被编辑时&#xff0c;标 签控件同步显 示编辑控件里的内容 1&#xff09;当 lineEdit 控件被用户编辑时&#xff0c;它…

重生之 SpringBoot3 入门保姆级学习(17、整合SSM)

重生之 SpringBoot3 入门保姆级学习&#xff08;17、整合SSM&#xff09; 4、数据访问4.1 整合 ssm 4、数据访问 4.1 整合 ssm pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" …

coze扣子自定义插件使用方式1

1&#xff0c;模型中的工具描述 2&#xff0c;大模型调用&#xff0c;触发接口&#xff1a;

谨以此文章记录我的蓝桥杯备赛过程

以国优秀结束了蓝桥杯cb组 鄙人来自电信学院&#xff0c;非科班出身&#xff0c;在寒假&#xff0c;大约2024年2月份&#xff0c;跟着黑马程序员将c基础语法学完了&#xff0c;因为过年&#xff0c;事情较多&#xff0c;没在学了。 最初就是抱着拿省三的态度去打这个比赛的&a…

linux指令-高阶指令用法

前言 linux操作系统的环境变量的使用基础需要先了解 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、环境变量是什么&#xff1f; 在Linux系统中&#xff0c;环境变量是动态命名的值&#xff0c;这些值可以由shell&#xff08;如bash&#xff09;…

现代密码学-基础

安全业务 保密业务&#xff1a;数据加密 认证业务&#xff1a;保证通信真实性 完整性业务&#xff1a;保证所接收的消息未经复制、插入、篡改、重排或重放 不可否认业务&#xff1a;防止通信双方的某一方对所发消息的否认 访问控制&#xff1a;防止对网络资源的非授权访问&…

Java应用中的短信发送解决方案:RocketMQ实践指南

在当今的数字化时代&#xff0c;短信作为一种即时的通讯方式&#xff0c;被广泛应用于各种业务场景中&#xff0c;如用户身份验证、订单状态更新、营销推广等。对于Java应用来说&#xff0c;集成一个高效、可靠的短信发送服务是至关重要的。Apache RocketMQ 作为一款高性能、低…

《猎杀:对决》是适合什么样的人玩 Mac电脑怎么玩《猎杀:对决》

《猎杀&#xff1a;对决》是一款集合了生存、竞技和恐怖元素的多人在线游戏&#xff0c;自推出以来受到了广大玩家的热爱。本文将详细探讨《猎杀&#xff1a;对决》适合什么样的人玩以及Mac电脑怎么玩《猎杀&#xff1a;对决》。本文将一一解析&#xff0c;帮助你了解这款游戏是…

程序员的五大职业素养,你知道吗?

程序员职业生涯的挑战与机遇 在当今这个科技日新月异的时代&#xff0c;程序员作为技术行业的中坚力量&#xff0c;其职业生涯无疑充满了无数挑战与机遇。技术的快速迭代要求他们必须不断学习新知识、掌握新技能&#xff0c;以跟上时代的步伐。同时&#xff0c;云计算、人工智…

RFID防盗门:守护您的商品资产安全!

在新零售运营管理中&#xff0c;防盗是至关重要的一环。根据美国零售联合会发布的年度零售安全调查&#xff0c;2022年美国零售商损失了创纪录的1121亿美元。其中年度损失最大因素是由外部盗窃导致库存损失和员工内部盗窃造成的。 然而传统零售业商品资产盘点往往依赖人工排查&…

从零开始学习Linux(9)----文件系统

1.前言 1.铺垫 a.文件内容属性 b.访问文件之前&#xff0c;都得先打开&#xff0c;修改文件&#xff0c;都是通过执行代码的方式完成修改&#xff0c;文件必须被加载到内存中 c.谁打开文件&#xff1f;进程在打开文件 d.一个进程可以打开多少个文件呢&#xff1f;可以打开多个…

GSEA的算法只考虑排序吗

其实这个问题很好回答&#xff0c;只需要运行如下代码&#xff0c;如下的基因列表是顺序是完全相同&#xff0c;并且我们只是做了最基础的变换 library(clusterProfiler) library(org.Hs.eg.db)data(geneList, package"DOSE")ego1 <- gseGO(geneList geneLi…

【图像处理与机器视觉】灰度变化与空间滤波

基础 空间域与变换域 空间域&#xff1a;认为是图像本身&#xff0c;对于空间域的操作就是对图像中的像素直接进行修改 变换域&#xff1a;变换系数处理&#xff0c;不直接对于图像的像素进行处理 邻域 图像中某点的邻域被认为是包含该点的小区域&#xff0c;也被称为窗口 …

Chrome 调试技巧

1. alert 在最早的时候&#xff0c;javascript 程序员调试代码都是通过 alert 进行&#xff0c;但 alert 会让整个程序被打断&#xff0c;并且还有一个很大的缺点&#xff0c;调试完成之后&#xff0c;如果忘记将 alert 删除 or 注释掉&#xff0c;导致别人访问该页面时会莫名…

动画技术在AI绘画中的革新作用

引言&#xff1a; 随着人工智能技术的飞速发展&#xff0c;AI绘画作为其应用领域之一&#xff0c;已经引起了艺术和技术界的广泛关注。动画技术&#xff0c;作为视觉艺术的重要组成部分&#xff0c;与AI绘画的结合不仅为传统绘画带来了新的活力&#xff0c;也推动了创意表达和艺…

vscode 默认终端(Terminal) 为CMD,但是新建是powerShell

☆ 问题描述 vscode 默认终端&#xff08;Terminal&#xff09; 为CMD&#xff0c;但是新建是powerShell ★ 解决方案 随便设置其他为默认&#xff0c;然后再设置回来CMD为默认就行了&#xff0c;实在不行就重装vscode吧… ✅ 总结 应该是vscode的小bug

计算机网络学习实践:模拟PPP协议验证虚拟局域网(VLAN)

计算机网络实践&#xff1a;模拟PPP协议&&验证虚拟局域网&#xff08;VLAN&#xff09; 挺有意思的大家可以跟着做一做&#xff0c;我是跟着韩志刚老师的视频做的 https://www.bilibili.com/video/BV1Qr4y1N7cH?p31&vd_source7831c5b97cfc5c745eb48ff04f6515e7 …

【赠书第27期】向AI提问的艺术:提示工程入门与应用

文章目录 前言 1 问题的构建 1.1 明确性与具体性 1.2 结构化与层次性 1.3 相关性与针对性 2 提问的技巧 2.1 简洁明了 2.2 避免歧义 2.3 使用自然语言 3 与AI的互动策略 3.1 耐心与理解 3.2 逐步引导 3.3 反馈与调整 4 总结与展望 5 推荐图书 6 粉丝福利 前言 …