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

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

用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


相关文章
|
7月前
|
算法
算法编程(二十八):重新排列单词间的空格
算法编程(二十八):重新排列单词间的空格
63 0
|
6月前
884. 两句话中的不常见单词
884. 两句话中的不常见单词
|
7月前
每日一题(数字颠倒,单词倒排)
每日一题(数字颠倒,单词倒排)
38 1
|
编译器 C语言
C语言:将一句话的单词进行倒置,标点不倒置。
总体思路: (可以把两步顺序调换) 第一步: 把 整个字符串 逆序 (知道 整个字符串 的首尾地址后,一对一对向整个字符串中间靠拢交换)
137 0
|
算法 C语言
(c语言)将一句话的单词进行倒置,标点不倒置(i like beijing.)
(c语言)将一句话的单词进行倒置,标点不倒置(i like beijing.)
177 0
|
7月前
leetcode-884:两句话中的不常见单词
leetcode-884:两句话中的不常见单词
39 0
|
7月前
|
Java
【剑指offer】-翻转单词序列-40/67
【剑指offer】-翻转单词序列-40/67
倒置字符串(倒置单词,标点不倒置)
倒置字符串(倒置单词,标点不倒置)
57 0
【每日挠头算法题(8)】最后一个单词的长度|重新排列字符串
【每日挠头算法题(8)】最后一个单词的长度|重新排列字符串
剑指offer 65. 翻转单词顺序
剑指offer 65. 翻转单词顺序
62 0