【每日一题】 将一句话单词倒置,标点不倒置

简介: 【每日一题】 将一句话单词倒置,标点不倒置

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


比如输入: i like shanghai.


输出得到: shanghai. like i


这道题目有很多种做法,既可以用递归,也可以分成两部分函数来写,本文就详细来讲解分装为两个函数的做法。


思路:我们可以轻易实现一个字符串的倒置,可以先将整个字符串来倒置,然后再设置函数来倒序每一个单词,用空格作为区分每个单词的标志,这样下来就可以实现将一句话单词倒置,标点不倒置。


主函数如下所示。


int main()
{
  char s[100] = { 0 };
  gets_s(s);
  int start=0, end=strlen(s);
  reverse(start, end, s);
  reverse_word(start, end, s);
  printf("%s", s);
  return 0;
}


1.reverse函数的构建


首先构建reverse函数来实现整个字符串的逆转,只需创建一个中间变量即可。


void reverse(int start, int end, char s[])
{
  end--;
  while (start < end)
  {
  char tmp = s[start];
  s[start] = s[end];
  s[end] = tmp;
  start++;
  end--;
  }
}

需要注意的是,为了保证下标不在标点的位置,即为了不交换符号,end一定要-1。


如果不想再函数内部减一的话,可以在进行函数传参的时候减一。


2.reverse_word函数的创建


接下来创建将每一个单词逆转的函数,我们使用两个while循环。


外层循环的循环条件为while (s[end] != '\0'),当end的位置走到'\0'的位置时,循环结束。


内部的while循环是将end移位到一个单词的末尾,也就是空格的位置,与在开头的start共同将一个单词锁定,接着就可以再次调用上面的reverse函数实现单词的逆序。


要注意的是,单词的末尾可能是'\0',为了防止s[end]取到零值而导致函数提前结束,我们将不等于零值也变为循环的条件。


将一个单词逆序之后,我们将目标转换为下一个单词,先将end的值赋给start,再让end移位到下一个空格处,锁定第二个单词。


void reverse_word(int start, int end, char s[])
{
  start = 0, end = 0;
  while (s[end] != '\0')
  {
  while (s[end] != ' '&&s[end]!='\0')
  {
    end+=1;
  }
  reverse(start, end, s);
  start = end+1;
  if(s[end]!='\0')
  end += 1;
  }
}


完整代码:


#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
void reverse(int start, int end, char s[])
{
  end--;
  while (start < end)
  {
  char tmp = s[start];
  s[start] = s[end];
  s[end] = tmp;
  start++;
  end--;
  }
}
void reverse_word(int start, int end, char s[])
{
  start = 0, end = 0;
  while (s[end] != '\0')
  {
  while (s[end] != ' '&&s[end]!='\0')
  {
    end+=1;
  }
  reverse(start, end, s);
  start = end+1;
  if(s[end]!='\0')
  end += 1;
  }
}
int main()
{
  char s[100] = { 0 };
  gets_s(s);
  int start=0, end=strlen(s);
  reverse(start, end, s);
  reverse_word(start, end, s);
  printf("%s", s);
  return 0;
}

文章如果有问题的话,还请大佬们不吝赐教!


如果您觉得我写的不错,不妨点个赞支持一下哦~

e08b9d52415500efa74f67f57ba9f66e_9815bc9ac5ec490e9bcb1976ab5775ce.jpeg


相关文章
|
2月前
|
域名解析 JSON API
【干货满满】如何处理requests库调用API接口时的异常情况
在调用 API 时,网络波动、服务器错误、参数异常等情况难以避免。本文提供一套系统化的异常处理方案,涵盖 requests 库常见异常类型、处理策略、实战代码与最佳实践,通过分类处理、重试机制与兜底策略,提升接口调用的稳定性与可靠性。
|
8月前
|
开发工具 git
git的rebase和merge的区别
通过这些内容和示例,您可以深入理解Git的 `rebase`和 `merge`操作及其区别,选择合适的方法进行分支管理,提高版本控制的效率和规范性。希望这些内容对您的学习和工作有所帮助。
1406 5
|
Unix Linux Shell
不同RTOS中POSIX接口的实现差异
本文探讨了在开发实时应用时使用POSIX API来实现跨平台和可移植性的策略。
280 1
不同RTOS中POSIX接口的实现差异
|
人工智能 Linux Shell
Linux——vim简介、配置方案(附带超美观的配置方案)、常用模式的基本操作
Linux——vim简介、配置方案(附带超美观的配置方案)、常用模式的基本操作
1249 2
|
存储 人工智能 API
【AIGC】基于检索增强技术(RAG)构建大语言模型(LLM)应用程序
【5月更文挑战第7天】基于检索增强技术(RAG)构建大语言模型(LLM)应用程序实践
628 1
|
移动开发 JavaScript Android开发
如何实用便捷的在本地真机调试WEB端HTML5网页
如何实用便捷的在本地真机调试WEB端HTML5网页
|
存储 Java Unix
(八)Java网络编程之IO模型篇-内核Select、Poll、Epoll多路复用函数源码深度历险!
select/poll、epoll这些词汇相信诸位都不陌生,因为在Redis/Nginx/Netty等一些高性能技术栈的底层原理中,大家应该都见过它们的身影,接下来重点讲解这块内容。
294 0