【C语言题解】将一句话的单词进行倒置,标点不倒置。

news/2024/12/23 7:28:22/

题目描述:将一句话的单词进行倒置,标点不倒置。比如 “I like beijing.”,经过处理后变为:“beijing. like I”。

文章目录

  • 原题目
    • 题目描述:
    • 输入描述:
    • 输出描述:
    • 题目链接:
  • 整体思路
  • 分步实现
    • 1. 输入字符串
    • 2. 逆序功能
    • 3. 整句话逆序
    • 4. 单词逆序
    • 5. 整体代码和oj结果
  • 写在最后

原题目

题目描述:

将一句话的单词进行倒置,标点不倒置。比如 “I like beijing.”,经过处理后变为:“beijing. like I”。
字符串长度不超过100。

输入描述:

输入一个仅包含小写字母、空格、‘.’ 的字符串,长度不超过100。
‘.’ 只出现在最后一个单词的末尾。

输出描述:

依次输出倒置之后的字符串,以空格分割。

题目链接:

https://www.nowcoder.com/questionTerminal/8869d99cf1264e60a6d9eff4295e5bab

整体思路

先将整句话逆序处理,然后再将每个单词进行逆序,这样一来整句话的顺序虽然颠倒了,但是单词因为逆序了两次,还是正常顺序。

分步实现

1. 输入字符串

利用gets函数输入获取整句话的字符串。

#include <stdio.h>
int main()
{char arr[100];gets(arr);//和scanf函数类似,获取键盘输入的字符printf("%s", arr);//测试是否获取到了return 0;
}

编译结果:
image.png

2. 逆序功能

自定义写一个reverse函数,利用指针来逆序字符串的内容,之所以写成函数是因为这个功能需要复用。
利用数组在栈区中存放时,下标由小到大,地址由低到高存放的原理,判断其首元素地址和末位元素的地址,如果左边的地址小于右边,使用指针进行元素交换,并且左边指针++,右边指针–,重新进行循环判断,直到左边大于等于右边,则跳出循环,这样就可以完成字符串的逆序操作。

#include<string.h>
void reverse(char* left, char* right)
{char tmp;while (left < right){tmp = *left;*left = *right;*right = tmp;left++;right--;}
}

3. 整句话逆序

利用strlen函数,求得字符串长度,就可以利用reverse函数将首元素地址,和首元素地址加字符串长度减一,将整句话逆序。

#include <stdio.h>
int main()
{char arr[100];gets(arr);int len = strlen(arr);reverse(arr, arr + len - 1);//传入首元素地址和末位元素地址printf("%s\n", arr);//测试用return 0;
}

编译结果:
image.png

4. 单词逆序

利用指针来判断是否遇到了空格或者\0,没有遇到的话,指针向前走,如果遇到了,就将之前的内容逆序一次,直到指针走到\0,跳出循环。

int main()
{char arr[100];gets(arr);int len = strlen(arr);reverse(arr, arr + len - 1);char* cur = arr;//cur作为光标遍历整个字符串并进行判断char* start = arr;//start作为每个单词的第一个元素地址指针用while (*cur){while (*cur != ' ' && *cur != '\0'){cur++;//不是空格或者\0,指针就向前走}reverse(start, cur - 1);//将这个单词的开头和末位地址传入reverse进行逆序start = cur + 1;//start去指向新单词的开头if (*cur != '\0')//直到*cur(数组元素)等于\0时,cur(指针)停止++,并且在while循环处跳出循环(因为\0就是0,为假){cur++;}}printf("%s\n", arr);//打印字符串return 0;
}

编译结果:
image.png

5. 整体代码和oj结果

#include <stdio.h>
#include<string.h>void reverse(char* left, char* right)
{char tmp;while (left < right){tmp = *left;*left = *right;*right = tmp;left++;right--;}
}int main()
{char arr[100];gets(arr);int len = strlen(arr);reverse(arr, arr + len - 1);char* cur = arr;char* start = arr;while (*cur){while (*cur != ' ' && *cur != '\0'){cur++;}reverse(start, cur - 1);start = cur + 1;if (*cur != '\0'){cur++;}}printf("%s\n", arr);return 0;
}

image.png

写在最后

如果本文对您有帮助,可不可以给我一个小小的点赞呀❤~您的支持是我最大的动力。

博主小白一枚,才疏学浅,难免有所纰漏,欢迎大家讨论和提出问题,博主一定第一时间改正。

谢谢观看嘿嘿(๑•̀ㅂ•́)و✧~!


http://www.ppmy.cn/news/1015556.html

相关文章

揭秘bi数据分析系统:如何轻松掌握商业智能的秘密

在大数据时代的背景下&#xff0c;企业开始越来越重视数据分析的重要性。bi数据分析系统不仅可以帮助企业感知市场变化趋势&#xff0c;还可以实时监测并评估企业经营决策的效果&#xff0c;支持企业的持续发展。在国内&#xff0c;国产数据处理工具如瓴羊Quick BI等崛起&#…

C语言案例 打印秋水仙花数-05

题目&#xff1a;打印出所有的水仙花数。 步骤一&#xff1a;定义程序目标 编写一个C程序&#xff0c;输出所有的水仙花数。步骤二&#xff1a;程序设计 原理&#xff1a;所谓“水仙花数”是指一个三位数&#xff0c;其各位数字立方和等于该数本身例如&#xff1a;153是一个“…

TS学习01-基本数据类型

基础类型 数组 第一种&#xff1a; 元素类型[] let arr: number[] [1,2,3]第二种: 数组泛型-Array<元素类型> let arr: Array<number> [1,2,3]元组 Tuple 表示一个已知元素数量和类型的数组 let arr: [string, number] a [RenNing, 18]当访问越界元素&…

mousedown拖拽功能(vue3+ts)

因为项目有rem适配&#xff0c;使用第三方插件无法处理适配问题&#xff0c;所有只能自己写拖拽功能了 拖拽一般都会想到按下&#xff0c;移动&#xff0c;放开&#xff0c;但是本人亲测&#xff0c;就在div绑定一个按下事件就行了&#xff08;在事件里面写另外两个事件&#x…

rv1126移植并部署自写手写数字识别模型

首先搭建好rknntoolkit以及rknpu环境 --> MNIST->https://github.com/warren-wzw/MNIST-pytorch.git 大致流程 生成rknn文件----------------------------------------------------------------------------------------- 1&#xff1a;进入docker docker run -t -i…

企业进销存管理流程有哪些? 附进销存管理系统

阅读本文&#xff0c;您可以了解&#xff1a;1、进销存的定义&#xff1b;2、进销存的流程 首先&#xff0c;在了解进销存流程之前&#xff0c;我们必须厘清一个问题&#xff1f; 什么是进销存&#xff1f; 进销存是一个企业管理中常用的术语&#xff0c;是指企业在经营过程中…

VMnet0 桥接设置

VMnet0 一定要设置为你的硬件物理网卡&#xff0c;不能设置自动&#xff0c;不然后&#xff0c;网线一断&#xff0c;就再也连不上了。必须重启电脑才能连上&#xff0c;这个问题找了很久才找到。 下面有个hyper-V虚拟网卡&#xff0c;如果选自动的话&#xff0c;物理网卡一掉…

Java实现电影信息查询系统

Java实现电影信息查询系统 需求分析代码实现小结Time 需求分析 首先每一部电影&#xff0c;都包含这部电影的相关信息&#xff0c;比如&#xff1a;电影的编号&#xff08;id&#xff09;、电影的名称&#xff08;name&#xff09;、电影的价格&#xff08;price&#xff09;、…