C语言:将一句话的单词进行倒置,标点不倒置。

news2024/11/28 9:37:51

题目:

一句话单词进行倒置标点不倒置。(字符数组长度不超过100)

比如:I like beijing.

经过函数后变为:beijing. like I

                    

 =========================================================================

                       

思路:

总体思路:

可以两步顺序调换
               

第一步把 整个字符串 逆序

(知道 整个字符串 首尾地址后,一对一对向整个字符串中间靠拢交换

           

第二步再逆序 每个单词
(知道 每个单词首尾地址后,一对一对向单词中间靠拢交换

              

两步中逆序的方法一样的,可以写一个相应的 自定义函数reverse

                


                 

补充知识点一:gets()

读取一个 字符串即使中间有空格

               

    gets(arr);  --  把读取到的字符串 放进 字符串数组arr

               

(编译器可能会觉得该函数不安全而报警告,因为读取的字符串放进数组后可能会导致数组越界,可能会报错爆红,但还是可以用的)

                


                 

补充知识点二:fgets()

可以使用 fgets()函数 替代 gets()函数

               

fgets(arr, 100, stdin);

               

函数参数:

               

arr:把读取的字符串放进字符数组arr

               

100获取字符串最大字符数,这里设置为100

               

stdin输入方式stdin 键盘输入

               

(因为指定了获取的字符个数,所以不用担心数组越界,也就不会报警告

                


                 

第一步:

完成 逆序自定义函数reverse 编写:

         

(1).  

函数参数:

char* left -- 左元素位置

char* right -- 右元素位置

         

(2).

使用 while循环left < right 继续循环逆序,因为此时数组还有数

                

使用临时变量tmp,进行数组元素调换

         

调换一次后就调整一次左右位置

                     

实现代码:

#include <stdio.h>

//逆序自定义函数 reverse:
void reverse(char* left, char* right)
{
	//使用while循环:
	while (left < right)
	//左小于右,说明中间还有值且没有指向一个字符,继续逆序
	{
		//使用临时变量tmp进行逆序:
		char tmp = *left;
		*left = *right;
		*right = tmp;
		//调换后调整左右位置
		left++;
		right--;
	}
}

int main()
{

}

实现图片:

                 


                 

第二步:

主函数:

            

(1). 定义字符数组,数组长度不超过100,那就设置为101

         

(2). 使用 gets(arr); 读取到的字符串 放进 字符串数组arr

            

(3). 求字符串长度 -- strlen(arr); 需要头文件<string.h>

            

(4). 使用 逆序自定义函数reverse 逆序 整个字符数组

整个数组arr的左右下标传给函数reverse即可

                     

实现代码:

#include <stdio.h>
#include <string.h>

//逆序自定义函数 reverse:
void reverse(char* left, char* right)
{
	//使用while循环:
	while (left < right)
	//左小于右,说明中间还有值且没有指向一个字符,继续逆序
	{
		//使用临时变量tmp进行逆序:
		char tmp = *left;
		*left = *right;
		*right = tmp;
		//调换后调整左右位置
		left++;
		right--;
	}
}

int main()
{
	//定义字符数组:
	char arr[101];

	//使用 gets(arr) 获取字符串
	gets(arr);

	//求字符串长度:
	int len = strlen(arr);
	//strlen 不会把 \0 计算进去,找到 \0 就停了
	//需要头文件:<string.h>

	//逆序整个字符串:
	reverse(arr, arr + len - 1); //调用自定义逆序函数
	//函数参数:数组首地址(左指针)、最后一个字符的地址(右指针)
	//arr+len-1:首地址 + 数组长度 - 1 --> 最后一个字符的地址
}

实现图片:

                 


                 

第三步:

主函数:逆序整个单词:

         

(1). 定义单词 起始 尾部 位置

char* start; -- 单词起始位置

char* cur; -- 单词尾部位置

              

(2). 使用 while循环 循环查找单词并逆序单词

*cur 单词尾部还没有到结束符 '\0' 就继续找单词

            

(3). 内嵌 while循环 ,调整 cur 单词尾部位置:

*cur 单词尾部还没有到 空格(每个单词间隔一个空格) 

 还没到结束符 '\0' 

cur++调整当前单词尾部位置

             

(4). 经过上一个步骤,找到了一个单词(第一次while循环),

对该单词进行逆序

调用 逆序函数reverse,

将该单词的首位(左右)位置传给reverse即可

                     

(5). 调整 start 单词起始位置到下一个单词的起始位置

start = cur +1; -- cur + 1, 空格后的下一个位置就是下一个单词的起始位置 

               

(6). 调整 cur 单词尾部位置

先使用 if条件判断语句 调整到空格后一位,即单词起始位置

再在下一次循环通过内嵌的 while循环 调整到该单词的尾部位置

              

实现代码:

#include <stdio.h>
#include <string.h>

//逆序自定义函数 reverse:
void reverse(char* left, char* right)
{
	//使用while循环:
	while (left < right)
	//左小于右,说明中间还有值且没有指向一个字符,继续逆序
	{
		//使用临时变量tmp进行逆序:
		char tmp = *left;
		*left = *right;
		*right = tmp;
		//调换后调整左右位置
		left++;
		right--;
	}
}

int main()
{
	//定义字符数组:
	char arr[101];

	//使用 gets(arr) 获取字符串
	gets(arr);

	//求字符串长度:
	int len = strlen(arr);
	//strlen 不会把 \0 计算进去,找到 \0 就停了
	//需要头文件:<string.h>

	//逆序整个字符串:
	reverse(arr, arr + len - 1); //调用自定义逆序函数
	//函数参数:数组首地址(左指针)、最后一个字符的地址(右指针)
	//arr+len-1:首地址 + 数组长度 - 1 --> 最后一个字符的地址

	//逆序每个单词:
	//定义 单词的 起始 和 尾部 位置:
	char* start = arr; //单词起始位置
	char* cur = arr; //单词尾部位置,后面再调整

	//使用 while循环 循环查找并逆序单词:
	while (*cur != '\0')
	//整个字符串还没结束,继续找单词
	{
		//内嵌 while循环 调整单词尾部位置cur:
		while (*cur != ' ' && *cur != '\0')
		//单词尾部未找到空格且还没有结束符就继续往后移一位
		{
			cur++;//往后移一位
		}//直到找到单词,此时在空格位置

		//找到单词后进行单词逆序:
		reverse(start, cur - 1);
		//因为单词尾部 cur 此时在 空格位置,
		//所以要在空格(或\0,最后一个单词)位置前-1

		//找下一个单词:
		//调整start单词起始位置:
		start = cur + 1;
		//cur+1,空格后的下一个位置就是下一个单词的首地址

		//调整单词尾部位置:
		if (*cur == ' ')
		//只有是空格时才能跳过,\0不能再跳过了,不然就跳不出循环了
		{
			cur++;//调整下一个单词尾部位置到起始位置
		}
	}

}

实现图片:

                 


                 

第四步:

两个逆序都完成后,进行打印

                     

实现代码:

#include <stdio.h>
#include <string.h>

//逆序自定义函数 reverse:
void reverse(char* left, char* right)
{
	//使用while循环:
	while (left < right)
	//左小于右,说明中间还有值且没有指向一个字符,继续逆序
	{
		//使用临时变量tmp进行逆序:
		char tmp = *left;
		*left = *right;
		*right = tmp;
		//调换后调整左右位置
		left++;
		right--;
	}
}

int main()
{
	//定义字符数组:
	char arr[101];

	//使用 gets(arr) 获取字符串
	gets(arr);

	//求字符串长度:
	int len = strlen(arr);
	//strlen 不会把 \0 计算进去,找到 \0 就停了
	//需要头文件:<string.h>

	//逆序整个字符串:
	reverse(arr, arr + len - 1); //调用自定义逆序函数
	//函数参数:数组首地址(左指针)、最后一个字符的地址(右指针)
	//arr+len-1:首地址 + 数组长度 - 1 --> 最后一个字符的地址

	//逆序每个单词:
	//定义 单词的 起始 和 尾部 位置:
	char* start = arr; //单词起始位置
	char* cur = arr; //单词尾部位置,后面再调整

	//使用 while循环 循环查找并逆序单词:
	while (*cur != '\0')
	//整个字符串还没结束,继续找单词
	{
		//内嵌 while循环 调整单词尾部位置cur:
		while (*cur != ' ' && *cur != '\0')
		//单词尾部未找到空格且还没有结束符就继续往后移一位
		{
			cur++;//往后移一位
		}//直到找到单词,此时在空格位置

		//找到单词后进行单词逆序:
		reverse(start, cur - 1);
		//因为单词尾部 cur 此时在 空格位置,
		//所以要在空格(或\0,最后一个单词)位置前-1

		//找下一个单词:
		//调整start单词起始位置:
		start = cur + 1;
		//cur+1,空格后的下一个位置就是下一个单词的首地址

		//调整单词尾部位置:
		if (*cur == ' ')
		//只有是空格时才能跳过,\0不能再跳过了,不然就跳不出循环了
		{
			cur++;//调整下一个单词尾部位置到起始位置
		}
	}

	//两个逆序都完成后,进行打印:
	printf("%s", arr);

}

实现图片:

                    

最终代码和实现效果

最终代码:

#include <stdio.h>
#include <string.h>

//逆序自定义函数 reverse:
void reverse(char* left, char* right)
{
	//使用while循环:
	while (left < right)
	//左小于右,说明中间还有值且没有指向一个字符,继续逆序
	{
		//使用临时变量tmp进行逆序:
		char tmp = *left;
		*left = *right;
		*right = tmp;
		//调换后调整左右位置
		left++;
		right--;
	}
}

int main()
{
	//定义字符数组:
	char arr[101];

	//使用 gets(arr) 获取字符串
	gets(arr);

	//求字符串长度:
	int len = strlen(arr);
	//strlen 不会把 \0 计算进去,找到 \0 就停了
	//需要头文件:<string.h>

	//逆序整个字符串:
	reverse(arr, arr + len - 1); //调用自定义逆序函数
	//函数参数:数组首地址(左指针)、最后一个字符的地址(右指针)
	//arr+len-1:首地址 + 数组长度 - 1 --> 最后一个字符的地址

	//逆序每个单词:
	//定义 单词的 起始 和 尾部 位置:
	char* start = arr; //单词起始位置
	char* cur = arr; //单词尾部位置,后面再调整

	//使用 while循环 循环查找并逆序单词:
	while (*cur != '\0')
	//整个字符串还没结束,继续找单词
	{
		//内嵌 while循环 调整单词尾部位置cur:
		while (*cur != ' ' && *cur != '\0')
		//单词尾部未找到空格且还没有结束符就继续往后移一位
		{
			cur++;//往后移一位
		}//直到找到单词,此时在空格位置

		//找到单词后进行单词逆序:
		reverse(start, cur - 1);
		//因为单词尾部 cur 此时在 空格位置,
		//所以要在空格(或\0,最后一个单词)位置前-1

		//找下一个单词:
		//调整start单词起始位置:
		start = cur + 1;
		//cur+1,空格后的下一个位置就是下一个单词的首地址

		//调整单词尾部位置:
		if (*cur == ' ')
		//只有是空格时才能跳过,\0不能再跳过了,不然就跳不出循环了
		{
			cur++;//调整下一个单词尾部位置到起始位置
		}
	}

	//两个逆序都完成后,进行打印:
	printf("%s", arr);

}

实现效果:

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

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

相关文章

chatgpt赋能python:Python中寻找不重复字符的方法

Python中寻找不重复字符的方法 Python是一种著名界面友好、易学易用且功能强大的编程语言&#xff0c;广泛应用于各种需求中。在本篇文章中&#xff0c;我们将会讨论如何使用Python编程语言来寻找一个字符串中的不重复字符。我们将简单介绍如何实现这个过程以及为什么这个过程…

Python小白如何利用GPT4快速开发一个网站!

这个是一个全栈的项目&#xff0c;麻雀虽小&#xff0c;五脏俱全&#xff01;全程都是利用gpt4进行辅助编程搞定的。第一版其实非常快&#xff0c;大概30分钟就搞定了&#xff0c;后续就是不断的添砖加瓦&#xff0c;增加功能和优化UI。 其实很多小白都在说要学Python&#xff…

chatgpt赋能python:Python扩展库需要导入吗?重要性与结论解析

Python扩展库需要导入吗&#xff1f;重要性与结论解析 作为业内最受欢迎的编程语言之一&#xff0c;Python在数据科学、人工智能、Web开发等领域拥有大量的应用。在Python开发过程中&#xff0c;扩展库的使用是不可避免的。本文将介绍Python扩展库的重要性以及是否需要导入的问…

【Arduino】Portenta H7 板子介绍

文章目录 1. Features2. Pins Name3. Functions3.1 analogReadResolution()3.2 millis() Ref. 1. Features 2. Pins Name 3. Functions 3.1 analogReadResolution() analogReadResolution() is an extension of the Analog API for the Zero, Due, MKR family, Nano 33 (BLE …

vue3-实战-10-管理后台-权限管理之用户管理模块开发

目录 1-用户首页列表开发 1.1-需求原型分析 1.2-封装请求和数据类型 1.3-数据页面渲染和展示 1.4-点击搜索按钮搜索用户 1.5-点击重置按钮 2-新增编辑用户 2.1-原型需求分析 2.2-表单页面数据收集 2.3-页面校验规则的定义 2.4-添加用户按钮编辑按钮逻辑 2.5-保存和取…

C++个人通信录系统

背景&#xff1a; 使用C编写一个通信录程序&#xff0c;来完成作业上的一些需求。 1-提供录入个人信息、修改个人信息&#xff08;姓名和出生日期除外&#xff09;、删除个人信息等编辑功能 2-提供按姓名查询个人信息的功能 3-提供查找在5天之内过生日的人员的信息&#xf…

Gof23设计模式之工厂方法模式和抽象工厂模式

在java中&#xff0c;万物皆对象&#xff0c;这些对象都需要创建&#xff0c;如果创建的时候直接new该对象&#xff0c;就会对该对象耦合严重&#xff0c;假如我们要更换对象&#xff0c;所有new对象的地方都需要修改一遍&#xff0c;这显然违背了软件设计的开闭原则。 如果我们…

机器学习之K-Means(k均值)算法

1 K-Means介绍 K-Means算法又称K均值算法&#xff0c;属于聚类&#xff08;clustering&#xff09;算法的一种&#xff0c;是应用最广泛的聚类算法之一。所谓聚类&#xff0c;即根据相似性原则&#xff0c;将具有较高相似度的数据对象划分至同一类簇&#xff0c;将具有较高相异…

NDK使用LLVM编译Boost库给Android使用

1.下载boost库 ​ wget https://boostorg.jfrog.io/artifactory/main/release/1.71.0/source/boost_1_71_0.tar.gz​ 选择1.71.0版本 NDK版本19 ,ANDROID版本 24 进入然后后的目录 (不指定平台 默认为当前系统平台) ./bootstrap.sh --prefix=./android_build --libdir=.…

Java---阶段项目----五子棋

Java---阶段项目----五子棋 需求说明技术实现棋盘制作完整代码 需求说明 五子棋棋盘为一个1010的方格&#xff0c;五子棋玩家共为两个(A,B)&#xff0c;A在棋盘上落子后&#xff0c;B再落子&#xff0c;依次往复&#xff0c;直到一方胜利或者棋盘空间用完为止&#xff0c;判断…

StarCCM+ 命令行运行(Windows)

添加环境变量 找到启动程序的位置。找到当初安装starccm的文件夹&#xff0c;一般就是 Siemens 文件夹&#xff0c;进入会看到各版本的安装文件夹&#xff08;如果你没有安装多个版本则只有一个&#xff09;&#xff0c;然后参考下面我的路径找到相应的文件夹。在bin文件夹内可…

【openGauss简单使用---快速入门】

【openGauss简单使用---快速入门】 &#x1f53b; 一、openGauss使用&#x1f530; 1.1 连接openGauss&#x1f530; 1.2 创建数据库用户和授权&#x1f530; 1.3 创建数据库&#x1f530; 1.4 创建SCHEMA&#x1f530; 1.5 创建表 &#x1f53b; 二、总结—温故知新 &#x1f…

信息系统之网络安全方案 — “3保1评”

信息系统之网络安全方案 — “3保1评” 序&#xff1a;什么是“3评1保”&#xff1f;一、网络安全等级保护1.1 概念1.2等保发展1.3法律要求1.4分级及工作流程 二、涉密信息系统分级保护2.1概念2.2法律要求2.3分级及工作流程 三、关键信息基础设施保护3.1概念3.2关保的发展3.3法…

建立和使用Python自定义模块:打包+pip安装

文章目录 &#xff08;零&#xff09;拷目录-无法卸载&#xff08;一&#xff09;打包结构&#xff08;1.1&#xff09;__init__.py&#xff08;1.2&#xff09;setup.py &#xff08;二&#xff09;开始打包&#xff08;2.1&#xff09;命令出错&#xff1f; &#xff08;三&a…

构建高可用、高并发和高性能的微服务系统(Spring Cloud实现)

目前Java都在流行一个说词&#xff1a;高并发。 反正不管是不是&#xff0c;反正就是高并发。 谈高并发&#xff0c;我们需要知道几个名词&#xff1a; -响应时间(Response Time&#xff0c;RT)-吞吐量(Throughput)-每秒查询率QPS(Query Per Second)-每秒事务处理量TPS(Transa…

SuiteQlet Bundle

Content​​​​​​​ 1. Foreword 2. Overview 2.1 Glossary 2.2 Features 2.3 Design Description 3. Install 4. Setup 5. Instruction 5.1 Query 5.2 Chart 5.3 Publish Dashboard 6. Note 7. Video Link 1. Foreword SuiteQL is a powerful tool for data q…

python 第八章 集合set {}

系列文章目录 第一章 初识python 第二章 变量 第三章 基础语句 第四章 字符串str 第五章 列表list [] 第六章 元组tuple ( ) 第七章 字典dict {} 文章目录 8.1 创建集合8.2集合常见操作方法增加数据删除数据查找数据 8.1 创建集合 创建集合使用 { } 或 set()&#xff0c;但是如…

【MySQL】增删查改基础

目录 一、Create(创建) 1、insert(插入) 1.1单行数据插入 1.2多行数据插入 1.3插入或者替换更新 2、replace(替换) 二、Retrieve(读取) 1、select 1.1全列查询 1.2指定列查询利用selsct计算表达式 1.3筛选结果去重 2、where 2.1运算符 2.2找到英语小于60分的同学…

RFID课程要点总结_4 Tag Identification Protocol

4. Tag Identification Protocol Checksum procedure: parity checks, LRC, CRC 奇偶校验不多说&#xff0c;查1的个数&#xff0c;poor error recognition。电路通过所有位异或是偶校验&#xff0c;结果为1说明有错误&#xff1b;再取反是奇校验。 LRC longitudinal redund…

02 React组件、React组件实例的三大核心属性

总结 一、React组件 1.1 函数组件 定义 要求组件名称的首字母需要大写 function 组件名称(){ // 返回一段jsx的视图结构 return <div></div> }调用 <组件名称></组件名称> 或 <组件名称 /> 组件名首字母必须大写. 因为react以此来区分组件元…