C语言——小细节和小知识12

一、倒置句子

将句子中的单词位置倒置,标点不用倒置,例如i love you.倒置结果是:you. love i。

1、两步翻转法

采用两步翻转法来实现单词位置的倒置。首先,它整体翻转整个字符串,然后再逐个翻转每个单词内的字符。

#include <stdio.h>
#include <string.h>void ReverseString(char* ptr)
{char temp = '\0';int length = (int)strlen(ptr);int i = 0,j = 0;for (i = 0,j = length - 1; i < length / 2; i++,j--){temp = *(ptr + j);*(ptr + j) = *(ptr + i);*(ptr + i) = temp;}for (i = 0,j = 0; i < length; i++){j = i;while (*(ptr + j) != ' ' && j < length){j++;}int WordEnd = j - 1;while (i < WordEnd){temp = *(ptr + i);*(ptr + i) = *(ptr + WordEnd);*(ptr + WordEnd) = temp;i++;WordEnd--;}i = j;}
}int main()
{char arr[10001] = { '\0' };fgets(arr, 10001,stdin);ReverseString(arr);printf("%s\n", arr);return 0;
}

工作流程:

  1. 函数定义

    • void ReverseString(char* ptr):这是一个自定义函数,接收一个字符串指针ptr作为参数,旨在反转该字符串中单词的顺序。
  2. 变量声明和初始化

    • temp:用于字符交换的临时变量。
    • length:通过调用strlen(ptr)得到输入字符串的长度。
    • ij:作为索引变量在字符串操作中使用。
  3. 第一个for循环:整体翻转字符串

    • 这个循环负责将整个字符串从头到尾翻转。通过交换指针ptr指向的首尾两端的字符,利用索引i从头开始,索引j从尾开始,直到它们相遇在字符串的中间。
  4. 第二个for循环:翻转单词内的字符

    • 在字符串被整体反转之后,这个循环的目的是将每个单词内部的字符顺序重新翻转到正确的顺序。
    • i从字符串的开始位置遍历,j用来查找单词的结尾(即空格字符或字符串的末尾)。
    • WordEnd是找到的单词的末尾索引。
    • 当内部的while循环开始时,iWordEnd用来交换单词内部的字符,直到单词被翻转到其原始顺序。
  5. main函数

    • arr:一个足够大的字符数组,用来存储用户通过gets_s函数输入的字符串。
    • gets_s(arr, 10001):安全地读取用户输入的字符串。gets_s是一个安全版本的函数,用于避免缓冲区溢出,第二个参数表示最大的字符串长度。
    • ReverseString(arr):调用前面定义的ReverseString函数,传入用户输入的字符串arr
    • printf("%s\n", arr):打印经过单词顺序翻转后的字符串。

运行结果:

2、倒读翻转法

从字符串的最后读取字符串内容,用两个数组存储,将原数组从尾部读取到首部,把单词一个个填入新数组中。

#include <stdio.h>
#include <string.h>void ReverseString(char* ptr1, char* ptr2)
{int len = strlen(ptr1);ptr1 += len;while (len > 0){while (*(ptr1) != ' ' && len > 0){if (len != 1){ptr1--;}len--;}char* ptr3 = NULL;if (len > 0){ptr3 = ptr1 + 1;}else{ptr3 = ptr1;}while (*(ptr3) != ' ' && *(ptr3) != '\0'){*ptr2++ = *ptr3++;}if (len > 0){*ptr2++ = ' ';ptr1--;if (len != 1){len--;}}}
}int main()
{char arr1[100] = { '\0' };char arr2[100] = { '\0' };fgets(arr1, 100,stdin);ReverseString(arr1, arr2);printf("%s\n", arr2);return 0;
}

主要函数 ReverseString 进行详细分析:

  1. 首先获取输入字符串 ptr1 的长度,并将指针移动到字符串的末尾。

  2. while 循环开始迭代,每次循环都是处理字符串中的一个单词。

  3. 内部的 while 循环负责找到单词的开始位置。它通过回退解析字符串,直到找到一个空格,这表示一个单词的结束。特别注意,如果长度为1,指针不回退,这处理了字符串开头的特殊情况,即第一个单词是一个字母的情况,例如第一个单词是I。

  4. 一旦找到空格或者到达字符串的开始,指针 ptr3 被设置为当前单词的第一个字符。

  5. 接下来的 while 循环将当前单词复制到输出字符串 ptr2 中。该循环依次复制字符,直到遇到空格或字符串终止符 \0 ,循环结束后这个单词完成复制。

  6. 如果还没有处理完所有字符(len > 0),在 ptr2 中添加一个空格以分隔单词,并将 ptr1 指针再次回退一个字符以找到下一个单词的结束。

  7. 这个过程不断重复,直到处理完所有的字符(即 len 为0)。

  8. main 函数中,通过 gets_s 函数从用户那里接受一个字符串。然后调用 ReverseString 函数处理这个字符串,并将结果打印出来。

运行结果:

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

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

相关文章

redis安装-Linux为例

可以下载一个Shell或者MobaXterm工具&#xff0c;便于操作 在redis官网下载压缩包 开始安装 安装依赖 yum install -y gcc tcl切换目录 切换目录后直接把redis安装包拖到/user/local/src/下 cd /user/local/src/解压然后安装 #解压 tar -zxvf redis-7.2.4.tar.gz #安装 …

day13

1.多态的向上转型和向下转型向上转型&#xff1a; 父类的引用指向子类的对象Person person new Man();向下转型: 将父类的引用强转为子类的对象Man man (Man) person; 2.instanceof关键字的用法引用 intanceof 运行类型 3.抽象类声明方式abstract class Person {} 4.接…

后端开发笔记20240117

文章目录 1.lambda表达式学习1.1 从list中找到符合条件的对象并且返回1.2 groupby的用法 2.时间做差取秒 1.lambda表达式学习 1.1 从list中找到符合条件的对象并且返回 这种案例在java中的应用很多&#xff0c;适用于轻度过滤&#xff0c;如果能sql直接查询出符合规定的那肯定…

python数字图像处理基础(六)——模板匹配、直方图

目录 模板匹配概念单对象模板匹配多对象模板匹配 直方图1.查找直方图2.绘制直方图3.掩膜的应用 模板匹配 概念 模板匹配和卷积原理很像&#xff0c;模板在原图像上从原点开始滑动&#xff0c;计算模板与图像被模板覆盖的地方的差别程度&#xff0c;这个差别程度的计算方法在o…

openssl3.2 - 官方demo学习 - pkey - EVP_PKEY_DSA_paramvalidate.c

文章目录 openssl3.2 - 官方demo学习 - pkey - EVP_PKEY_DSA_paramvalidate.c概述笔记END openssl3.2 - 官方demo学习 - pkey - EVP_PKEY_DSA_paramvalidate.c 概述 OPENSSL_hexstr2buf_ex 将16禁止字符串填充到16进制buffer BIO_new_mem_buf 有用, 可以内存的内容转为bio, 不…

如何安装“Nextcloud 客户端”win10系统?

1、 下载 Nextcloud的官网 Download and install Nextcloud 2、安装 3、 Nextcloud登录

组件v-model(.sync)记录使用(vue3)

示例&#xff08;演示地址&#xff09; 以下是Vue3中使用v-model实现组件的双向数据绑定的示例代码&#xff1a; 首先&#xff0c;让我们来了解一下Vue3中v-model的用法。在Vue3中&#xff0c;v-model 指令可以用于自定义组件上&#xff0c;用于实现组件的双向数据绑定。与Vue2…

python元类模型和class语句协议

1 python元类模型和class语句协议 学习python的类型模型和class语句协议。class语句末尾自动调用type()创建类对象并且赋值给类名称。 1.1 类是类型的实例 python3.x中&#xff0c;用户定义的类对象是名为type的对象的实例&#xff0c;type本身是一个类&#xff1b; python…

【温故而知新】HTML5存储localStorage/sessionStorage

文章目录 一、概念二、存储localStorage三、存储sessionStorage四、区别及优缺点1. 区别&#xff1a;2. 优缺点&#xff1a; 一、概念 HTML5是HTML的最新版本&#xff0c;它引入了许多新的元素和功能&#xff0c;以适应现代网页开发的需求。以下是HTML5的一些主要特点&#xf…

Alinx ZYNQ 7020 LED调试--in RAM

设置拨码开关为JTAG方式 烧写LED bit stream a. 点击“Program device”烧录程序到FPGA中&#xff08;重新上电程序就丢失了&#xff09; b. /01_led/led.runs/impl_1/led.bit 程序烧录到Flash中 ZYNQ与以往的直接烧录Flash不同&#xff0c;首先必须PS&#xff0c;然后烧…

python实例100第23例:打印菱形图案

题目&#xff1a;打印出如下图案&#xff08;菱形&#xff09;: ********* ****************程序分析&#xff1a;先把图形分成两部分来看待&#xff0c;前四行一个规律&#xff0c;后三行一个规律&#xff0c;利用双重for循环&#xff0c;第一层控制行&#xff0c;第二层控制列…

golang中make与new有什么区别?

前言 记录下go语言中函数new与make的使用和区别&#xff0c;关于go语言中new和make是内建的两个函数&#xff0c;主要用来创建分配类型内存。 目录 前言make介绍用法&#xff1a;1. 创建切片&#xff08;slice&#xff09;&#xff1a;2. 创建映射&#xff08;map&#xff09;…

AWS Secrets Manager 实战指南

AWS Secrets Manager 是一项强大的服务,用于安全地管理和存储敏感信息,如数据库凭证、API 密钥等。本实战指南将指导你如何在实际应用中使用 AWS Secrets Manager。 创建 Secret 首先,我们需要在 Secrets Manager 中创建一个新的 Secret 来存储敏感信息。 登录 AWS 控制台…

2744. 最大字符串配对数目

Problem: 2744. 最大字符串配对数目 文章目录 思路解题方法复杂度Code拓展官方解法拓展解释 思路 要求返回数组中的反转字符数目&#xff1b;数组中每个元素都是固定的2个长度的小写字符串&#xff0c;且不相同&#xff1b;由不相同可知如果是aa&#xff0c;bb这种类型的必定不…

spring-boot定时任务

org.springframework.boot jar包 内置定时任务注解 。生成定时任务有 * * * * * &#xff1f; 表示秒分时日月周。 日和周的位置 必须某个位置用&#xff1f;代替*号用于区别。 定时任务规则&#xff1a;0 * * * &#xff1f; * * 表示任意月的任意周的每天的每时的每分…

抖音矩阵云混剪系统源码(免授权版)多平台多账号一站式管理,附带系统搭建教程

搭建教程 MySQL 5.6 PHP 7.2 Apache 数据库名称 juzhen Nginx环境切换伪静态 1、解压安装包到项目根目录&#xff0c;找到application/database.php 更换自己的数据库密码 2、阿里云现有的配置不要动 其他按照文档进行添加 3、项目访问目录&#xff1a;public 4、域名…

SQL笔记 -- 查询优化

1. 关联查询优化 1.1 驱动表和被驱动表 对于内连接来说&#xff0c;优化器会根据用户的查询语句做优化&#xff0c;决定先查哪张表。先查询的那张表就是驱动表&#xff0c;反之就是被驱动表。而对于外连接来说&#xff0c;大多数情况用户指定的主表就是驱动表&#xff0c;但优…

Demo: 实现PDF加水印以及自定义水印样式

实现PDF加水印以及自定义水印样式 <template><div><button click"previewHandle">预览</button><button click"downFileHandle">下载</button><el-input v-model"watermarkText" /><el-input v-mo…

敏捷开发之Scrum

敏捷开发是什么 我们一般习惯用瀑布模型&#xff0c;它以文档为驱动&#xff0c;将软件生命周期划分为固定的六个基本活动&#xff0c;并且规定了它们自上而下、相互衔接的次序&#xff0c;如同瀑布流水&#xff0c;逐级下落。 那什么是敏捷开发呢&#xff1f; ​ 敏捷开发的核…

解决前端笔记本电脑屏幕显示缩放比例125%、150%对页面大小的影响问题

近期在工作中遇到一个问题&#xff0c;记录一下&#xff0c;在项目上线之后&#xff0c;遇到一个问题&#xff0c;即缩放到90%时&#xff0c;页面字体比默认的100%字体大&#xff0c;一开始毫无头绪&#xff0c;经过一番的Google...Google...Google....&#xff0c;终于找到了解…