C语言实现——字符串逆序

article/2025/10/24 6:43:27

目录

前言

如何实现

代码实现

1.设立一个数组存放输入的字符串

2.将输入的字符串整体逆序

2.1 计算字符串长度

2.2 使用函数来实现倒置

2.3 实现函数reverse 

3.将其中每个单词再进行逆序

3.1 整个语句如何结束循环

3.2 每个单词的结束位置

3.3 内部实现

3.4 判断语句结束,从而停止逆序

代码汇总

结语


前言

如何将一串含有多个单词的字符串逆序,并且每个单词及标点符号不逆序输出呢,下面我们一起来实现一下吧。

示例:

输入下列字符:

I like beijing.

 输出结果:

beijing. like I

如何实现

实现的思路如下:

1.设立一个数组存放输入的字符串

2.将输入的字符串整体逆序

.gnijieb ekil I

3.将其中每个单词再进行逆序

beijing. like I


代码实现

1.设立一个数组存放输入的字符串

#include <stdio.h>int main()
{char arr[100] = { 0 };gets(arr);//注意没有使用scanf,因为scanf遇到空格就会停止接收输入的内容printf("%s\n",arr);return 0;
}

2.将输入的字符串整体逆序

需要整体逆序字符串,就需要一个函数来实现,且需要给函数传递两个参数:第一个元素和最后一个元素,而求这两个元素需要首元素地址并计算一下数组内字符串的长度。

2.1 计算字符串长度

int len = strlen(arr);

2.2 使用函数来实现倒置

reverse(arr,arr+len-1);

2.3 实现函数reverse 

void reverse(char* left,char* right)
{while(left < right)//只有当左边的地址小于右边的地址时,才交换,中间的不需要交换{char tmp = 0;//定义并初始化一个中间值tmp = *left;//开始交换*left = *right;*right = tmp;left++;right--;}
}

此时整体代码如下 

void reverse(char* left, char* right)
{while (left<right){char tmp = 0;tmp = *left;*left = *right;*right = tmp;left++;right--;}
}int main()
{char arr[100] = { 0 };gets(arr);//获取字符串//将字符串倒置int len = strlen(arr);//计算字符串长度,以求最后一位的地址reverse(arr, arr+len-1);//进行倒置printf("%s\n",arr);return 0;
}

我们输入 I like beijing. 试试

3.将其中每个单词再进行逆序

这时我们需要将其中每个单词再进行逆序,这样才能达到我们需要的效果。

这其中需要注意几点:

1.整个语句如何结束循环

2.每个单词的起始位置和结束位置

3.内部如何实现

4.怎样才能判断语句结束,从而停止逆序

3.1 整个语句如何结束循环

我们可以定义一个起始位置,当这个位置的地址等于 '\0' 时,那么就相当于语句结束了。

char* start = arr;
while(*start != '\0')
{}

3.2 每个单词的结束位置

当遇到空格或者 '\0' 时,某一单词就结束了

我们可以首元素的地址赋给一个新的指针,只要这个指针指向的不是空格且不是 '\0' ,我们就让他往后挪一位,这样一个单词就找到了 

char* start = arr;
while(*start != '\0')
{char* end = start;while(*end != ' ' && *end != '\0'){end++;}          
}

3.3 内部实现

此时只要利用之前定义的函数来交换这个单词的每个字符,就可以完成一个单词的逆序

char* start = arr;
while(*start != '\0')
{char* end = start;while(*end != ' ' && *end != '\0')//一个单词的结束位置{end++;} reverse(start, end - 1);         
}

3.4 判断语句结束,从而停止逆序

接下来我们需要进行下一个单词的逆序,此时首元素的地址就需要之前的尾元素的地址再加1,那么如果整个语句结束了,此时还需要判断是否需要进行下一次逆序。

char* start = arr;
while(*start != '\0')
{char* end = start;while(*end != ' ' && *end != '\0')//一个单词的结束位置{end++;} reverse(start, end - 1); if(*end != '\0')//还有下一个单词start = end + 1;else            //末尾为'\0' 语句结束start = end;//跳出循环         
}

代码汇总

#include <stdio.h>
#include <string.h>//输入 I like beijing.
//输出 beijing. like I
void reverse(char* left, char* right)
{while (left<right){char tmp = 0;tmp = *left;*left = *right;*right = tmp;left++;right--;}
}int main()
{char arr[100] = { 0 };gets(arr);//获取字符串//将字符串倒置int len = strlen(arr);//计算字符串长度,以求最后一位的地址reverse(arr, arr+len-1);//进行倒置//将每个单词再倒置char* start = arr;//一个单词起始位置while (*start != '\0'){char* end = start;while (*end != ' ' && *end != '\0')//一个单词结束位置{end++;}reverse(start, end - 1);if (*end != '\0')start = end + 1;elsestart = end;}printf("%s\n", arr);return 0;
}

结语

此时我们的程序就完成啦,让我们来运行一下试试吧!

输入I like beijing.

大功告成!

此时我们可以思考一下这种方法的衍生版本,

比如在某种原因下,我们将一串字符每个单词的顺序弄颠倒了,我们需要重新进行排序,此时如何不变动标点符号来逆序?

如何替换特定单词的顺序,比如想把 I beijing like.变为正常的 I like beijing.又需要进行哪些操作呢?

如果大家有更好的方法或者想法,欢迎大家在评论区留言讨论哦~

由于本人能力有限,若有错误,希望指正!!!


http://chatgpt.dhexx.cn/article/W5Jr57NA.shtml

相关文章

dtb展开成device_node

dtb展开成device_node 文章目录 dtb展开成device_node设备树是如何传递给内核的&#xff1f;设备树相关结构体举例of操作函数与查找节点有关的 OF 函数1、of_find_node_by_name 函数2、of_find_node_by_type 函数3、of_find_compatible_node 函数4、of_find_matching_node_and_…

设备树之DTS与DTB格式

目录 一、设备树 二、DTS格式 2.1 属性 2.2 节点 2.3 引用其他节点 2.4 小总结 三、DTB格式 3.1 结构 3.2 分析 一、设备树 对于点灯字符设备驱动程序可以有三种写法&#xff0c;首先是传统方法&#xff0c;这种方式直接在程序中写死&#xff0c;其次是利用总线设备驱…

Android boot.img dtb.img 编译过程

最近做RK3588案子,修改dts后,导致boot.img过大,编译出错,整体分析下boot.img过大的原因是因为在打包boot.img过程中,dbt.img过大导致,所以整体分析下boot.img编译过程,尤其是dbt.img的生成过程. boot.img生成过程 在Andorid跟目录下执行, source build/envsetup.sh 然后lunch x…

Linux 设备树(二) dtc dts/dtsi dtb的关系

在学习设备树之前&#xff0c;我们先来了解一下跟设备树相关的三个对象&#xff0c;分别是dtc、dts/dtsi、dtb。 dtc:用来编译设备树的工具 dts:设备树描述文件 dtsi:设备树头文件 dtb:编译后的二进制文件 dtc设备树编译工具 dtc是用来编译设备树的工具&#xff0c;就像gcc可以…

dtb如何转换到platform_device

分2步&#xff0c;第一步是首先转换为device_node&#xff0c;第二步device_node转换为platform_device。 第一步 /*** unflatten_device_tree - create tree of device_nodes from flat blob** unflattens the device-tree passed by the firmware, creating the* tree of st…

U-Boot 之一 零基础编译 U-Boot 过程详解、Image 镜像介绍及使用说明、DTB 文件使用说明

最近&#xff0c;工作重心要从裸机开发转移到嵌入式 Linux 系统开发&#xff0c;在之前的博文 Linux 之八 完整嵌入式 Linux 环境、&#xff08;交叉&#xff09;编译工具链、CPU 体系架构、嵌入式系统构建工具 中详细介绍了嵌入式 Linux 环境&#xff0c;接下来就是实际动手学…

dts、dtb的那些事儿

笔者最近在支持新的案子&#xff0c;过于忙碌&#xff0c;好久没更新了&#xff0c;勿怪。 1、设备树大变革故事 2011年3月17日的ARM Linux邮件列表有封邮件“this whole ARM thing is a fucking pain in the ass”引起了轩然大波&#xff0c;原来是我们的Linux之父Linus Torv…

DBT工具简介

What is DBT 在将数据加载到集中式数据仓库之前&#xff0c;必须对其进行清理、保持一致并根据需要进行组合。换句话说&#xff0c;必须转换数据&#xff0c;这就是我们所谓的 ETL&#xff08;提取、转换、加载&#xff09;和 ELT 中的“T”。 这是挖掘数据价值的关键一步。 而…

4.2uboot对设备树的支持——dtb的修改原理

本节说明在uboot中修改dtb的原理。 在uboot中&#xff0c;有一些命令支持对dtb文件进行修改。 当我们想要修改dtb文件时&#xff0c;可以直接修改dts文件&#xff0c;然后编译dts文件生成新的dtb文件&#xff0c;再将新的dtb文件载入设备。 或者&#xff0c;我们也可以在ubo…

DBT是什么

关于DBT DBT 是一种数据转换工作流&#xff0c;可帮助您完成更多工作&#xff0c;同时产生更高质量的结果。您可以使用 dbt 来模块化和集中分析代码&#xff0c;同时还为数据团队提供软件工程工作流中常见的护栏。在将数据模型安全部署到生产环境之前&#xff0c;通过监控和可见…

2.1设备树的规范(dts和dtb)——DTS格式

本节学习设备树的规范。 使用设备树时&#xff0c;需要编写dts文件&#xff0c;然后使用dtc编译dts文件&#xff0c;生成dtb文件。 所以本节分为两部分&#xff0c;第一部分讲解dts格式&#xff0c;第二部分讲解dtb格式。 首先看一下dts文件的布局。 DTS文件布局&#xff0…

关于EMUELC适配各种机型,DTB如何修改教程

很多爱好者留言&#xff0c;都想问关于EMUELC的dtb适配机型问题&#xff0c;这里我就出一个教程&#xff0c;如何修改dtb&#xff0c;然后去适配自己的机型&#xff0c;然后启动 。这里我只是提供方法&#xff0c;具体的调试是需要原理图进行配置。 首先&#xff0c;不管是aml…

DTBO简介

1、DTBO简介 设备树 (DT) 是用于描述“不可发现”硬件的命名节点和属性构成的一种数据结构。操作系统&#xff08;例如在 Android 中使用的 Linux 内核&#xff09;会使用 DT 来支持 Android 设备使用的各种硬件配置。硬件供应商会提供自己的 DT 源文件&#xff0c;接下来…

【DTB/DTBO 分区介绍】

如果你的 DTB/DTBO 位于专属的分区&#xff08;例如 dtb 和 dtbo 分区&#xff09;中&#xff0c;请使用以下表格结构和头文件格式&#xff1a; 数据结构 dt_table_header 仅适用于 dtb/dtbo 分区&#xff1b;您不能在kernel( image.gz) 末尾处附加此格式。如果您有一个 DTB/D…

2.2设备树的规范(dts和dtb)——DTB格式

本节讲述设备树的dtb格式。 上节讲述了dts格式。回顾上节&#xff0c;在dts文件和dtsi文件中&#xff0c;可以使用C语言的define和include&#xff0c;使用方法和作用也同C语言相同。 编写dts文件后&#xff0c;需要使用dtc工具将dts文件编译成dtb文件。dtc工具可以检查dts文…

「设备树」dtb给内核的两种工作模式

一&#xff0c;传递dtb给内核 对于传统bootloader提供两种工作模式&#xff1a;一是启动加载模式&#xff08;start loading&#xff09;&#xff0c;一是下载模式&#xff08;downloading&#xff09; 工作在启动加载模式时&#xff0c;bootloader会自动执行bootcmd命令&#…

设备树_dtb文件分析

前言&#xff1a;我之前的原计划是没有打算写设备树dtb文件分析&#xff0c;但是情势所迫啊&#xff01;&#xff0c;学习还是要一步一步来的。 在前面的章节提到过.dts文件以文本方式对系统设备树进行描述&#xff0c;经过Device Tree Compiler(dtc)将dts文件转换成二进制文件…

Linux设备树学习2 - DTB文件格式

一. DTB文件简介 DTB文件是由DTS文件通过dtc命令编译生成的二进制文件。DTS文件不能直接被内核解析&#xff0c;需要编译成DTB文件才可以直接被内核识别并解析使用的。 二. DTB文件内容布局 从上图可以看出&#xff0c;DTB由四个部分组成&#xff0c;分别是struct fdt_header&a…

setUserVisibleHint-- fragment真正的onResume和onPause方法

这个情况仅适合与多个fragment之间切换时统计&#xff0c;而非activity和fragment同时交互&#xff0c;因当时项目为首页4个fargment时长统计&#xff0c;因此适合&#xff0c;经下面网友评论指出&#xff0c;特在这里写出此问题&#xff0c;因最近项目较忙&#xff0c;具体情况…

onCreate与onStart区别,onStart与onResume区别

http://www.cnblogs.com/kofi1122/archive/2011/04/10/2011772.html Activity生命周期之我见 关于Activity生命周期的文章很多&#xff0c;而且大部分也说得很详细&#xff0c;所以作为关于这方面的内容我本来不想多说&#xff0c;但是大家可能跟我之前一样&#xff0c;在看这方…