当前位置: 首页 > news >正文

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

题目描述:将一句话的单词进行倒置,标点不倒置。比如 “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.lryc.cn/news/114269.html

相关文章:

  • Postman 的简单使用
  • 在CentOS7安装部署GitLab服务
  • 订单系统就该这么设计,稳的一批~
  • Agents改变游戏规则,亚马逊云科技生成式AI让基础模型加速工作流
  • 详细教程:如何搭建废品回收小程序
  • 什么是双亲委派机制?
  • Mageia 9 RC1 正式发布,Mandriva Linux 发行版的社区分支
  • ChatGPT: 人机交互的未来
  • Linux 常用操作命令
  • 24届近5年重庆邮电大学自动化考研院校分析
  • 如何对oracle和mysql进行 分区分表
  • Windows下安装Sqoop
  • Chrome 谷歌浏览器,自动填充密码,提示需要输入电脑开机密码问题
  • Java技术整理(3)—— 多线程并发篇
  • 2023热门跨境电商平台哪个入驻条件适合新手?
  • 【MFC】05.MFC第一大机制:程序启动机制-笔记
  • 小程序动画 animation 的常规使用
  • Swift 周报 第三十四期
  • [虚幻引擎] UE DTBase64 插件说明 使用蓝图对字符串或文件进行Base64加密解密
  • Jmeter组件作用域及执行顺序
  • 题目:2309.兼具大小写的最好英文字母
  • RISC-V公测平台发布:如何在SG2042上玩转OpenMPI
  • Jenkins 使用
  • 使用go-zero快速构建微服务
  • Java开发 - Redis事务怎么用?
  • Windows Server 2019安装使用PostgreSQL 15
  • 中科驭数亮相DPU峰会,分享HADOS软件生态实践和大数据计算方案,再获评“匠芯技术奖”
  • chrome、edge、Firefox关闭音量提醒控件显示
  • 3.7v升压5v4A芯片用什么型号
  • 鉴源实验室丨SOME/IP协议安全攻击