目录

1.题目描述

2.思路

3.实现程序

1.输入字符串

2.每个单词逆序

3.逆序整个字符串

4.代码源及运行结果


1.题目描述

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

字符串长度不超过100。

输入描述:

输入一个仅包含小写字母、空格、'.' 的字符串,长度不超过100。

'.' 只出现在最后一个单词的末尾。

输出描述:

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

示例1

输入

I like beijing.

输出

beijing. like I

2.思路

3.实现程序

1.输入字符串

最多创建arr[101],保证可以放一个“\0

 char arr[101] = { 0 };//保证可以放“\0”gets(arr);

C输入使用scanf函数,但scanf默认回车和空格是输入不同组之间的间隔和结束符号,所以输入带空格,tab或者回车的字符串是不可以的,解决方法如下

(1)利用格式符“% []”它的作用为扫描字符集合。Scanf(“ % [^ c]”, str); 其中“c”是一个具体的字符常量(包括控制字符)。当输入字符串时,字符“c”将被当作当前输入的结束符。利用此格式符就可以由编程者自己指定一个输入结束符。

(2)使用gets函数,gets函数是以回车作为结束符。

2.每个单词逆序

我们可以每个单词进行逆序,首先需要将这个单词的起始位置记住,单词的起始位置其实就是数组首元素地址,定义char*类型的指针end等于数组名,单词的最后一个字符就是空格的前一个位置,我们也先让他等于数组首元素地址arr,同时运用一个while循环,当指针指向的字符为“ ”时停下,再减一,接着同时将开始和结束的指针传入reverse函数进行字符逆序

    while (*cur){char* start = cur;//记录一个单词的起始地址char* end = cur;//记录一个单词的末尾位置while (*end != ' '){end++;}reverse(start, end - 1);}

因为仅仅是将字符串逆序,并不需要传参,所以函数返回值类型为void;同时我们传进去的参数为两个指针,那么这时函数的参数也应该为两个char*类型的指针

使用while循环,当左侧地址小于右侧地址时,将两个指针指向的内容进行交换,交换完后两个指针同时向中间靠近,使用left++,right--

void reverse(char* left, char* right)
{assert(left);//对指针进行断言,保证指针有效性assert(right);//assert引头文件#include <assert.h>while (left < right){char temp = *left;*left = *right;*right = temp;left++;right--;}
}

我们要想逆序所有单词,就需要把他们放在一个while循环中。当第一个单词reverse进行字符串逆序后,我们需要让start指针向后移动,首先end指针目前指向的是第一个空格,当对第二个单词进行字符串逆序的时候,首字母地址就是空格后面的第一个字符,因此重新定义cur=end+1,同样指针end也应该向后走,不能仅仅停留在一个空格里面,所以end++!我们要让这个指针一直往后走,那么我们大的循环条件即为指针指向的不是最后一个字符\0。

while (*cur)
{char* start = cur;//记录一个单词的起始地址char* end = cur;//记录一个单词的末尾位置while (*end != ' '){end++;}reverse(start, end - 1);end++;cur = end + 1;
}

对每个单词进行逆序的时候,最后一个单词该怎么办?最后一个单词后面不再是空格而是\0,这时我们只需要在while循环里加上一个条件&&,并且end指针指向的不是\0,同时最后的end++,不能随意++,如果end指针指向的是最后一个字符,这时显然已经不再需要++,因此需要在++之前加上一个条件判断,如果end指针指向的内容不是\0再进行++,这样就完成了每个单词逆序。

while (*end != ' ' && *end != '\0')//最后一个单词后面为\0,没有空格,等于\0也得停下来{end++;//继续往后跑}//结束说明遇到空格  start为起始位置    end-1 为末尾位置    end指向空格reverse(start, end - 1);//逆序字符串if (*end != '\0')//不是因为\0停下来,而是因为空格停下来cur = end + 1;//指向下一个单词的起始位置,进行循环elsecur = end;

3.逆序整个字符串

使用strlen来求出字符串的长度

同时调用逆序函数reverse(left,right)即为将left与right之间的字符串进行逆序。

    int len = strlen(arr);//求出字符串的长度   stlren引头文件#include <string.h>reverse(arr, arr + len - 1);//arr + len - 1   最后一个字符地址

4.代码源及运行结果

#include<stdio.h>
#include<string.h>
#include<assert.h>
void reverse(char* left, char* right)
{assert(left);//对指针进行断言,保证指针有效性assert(right);//assert引头文件#include <assert.h>while (left < right){char temp = *left;*left = *right;*right = temp;left++;right--;}
}int main()
{char arr[101] = { 0 };//保证可以放“\0”gets(arr);//处理char* cur = arr;//数组名作为地址赋给cur指针//每个单词逆序while (*cur){char* start = cur;//记录一个单词的起始地址char* end = cur;//记录一个单词的末尾位置while (*end != ' ' && *end != '\0')//最后一个单词后面为\0,没有空格,等于\0也得停下来{end++;//继续往后跑}//结束说明遇到空格  start为起始位置    end-1 为末尾位置    end指向空格reverse(start, end - 1);//逆序字符串if (*end != '\0')//不是因为\0停下来,而是因为空格停下来cur = end + 1;//指向下一个单词的起始位置,进行循环elsecur = end;}//逆序整个字符串int len = strlen(arr);//求出字符串的长度   stlren引头文件#include <string.h>reverse(arr, arr + len - 1);//arr + len - 1   最后一个字符地址printf("%s", arr);return 0;
}

倒置字符串(巧妙解法,超详细!!!)相关推荐

  1. 字符、字符串、字符流以及字符串函数的超详细讲解

    前言 本文较为全面地总结了字符串的输入和输出,以及C++String类型常用函数等知识内容,其中包括对字符.字符数组.字符串.字 符串数组.字符串流的定义和输入输出的用法,对C/C++字符串的输入输出 ...

  2. c 获取char*的长度_C/C++编程笔记:C语言字符串比较函数,超详细,值得收藏

    void *memset(void *dest, int c, size_t count); 将dest前面count个字符置为字符c. 返回dest的值. void *memmove(void *d ...

  3. c 获取char*的长度_C/C++编程笔记:C语言字符串比较函数,超详细,值得收藏!...

    前方干货准备!!! void *memset(void *dest, int c, size_t count); 将dest前面count个字符置为字符c. 返回dest的值. void *memmo ...

  4. 如何比较字符串大小(超详细)

    前言 在工作中,我们常遇到比较两个值的大小的需求,如果比较的值是"数字"大小,那不用说,三岁小孩也会吧.但是如果比较的是字符串的大小,那肯定还是有些不一样的.今天我就来整理整理,希 ...

  5. C语言字符、字符串函数(超详细版)

    目录 strlen函数 三种方法模拟实现: 1.计数器: 2.指针 - 指针 3.函数递归 strcpy函数 strncpy函数 strcat函数 strncat函数 strcmp函数 strncmp ...

  6. 【C语言】字符串函数「超详细」

  7. Leetcode 1096:花括号展开 II(超详细!!!)

    如果你熟悉 Shell 编程,那么一定了解过花括号展开,它可以用来生成任意字符串. 花括号展开的表达式可以看作一个由 花括号.逗号 和 小写英文字母 组成的字符串,定义下面几条语法规则: 如果只给出单 ...

  8. Leetcode 1162:地图分析(超详细的解法!!!)

    你现在手里有一份大小为 N x N 的『地图』(网格) grid,上面的每个『区域』(单元格)都用 0 和 1 标记好了.其中 0 代表海洋,1 代表陆地,你知道距离陆地区域最远的海洋区域是是哪一个吗 ...

  9. Leetcode 37:解数独(超详细的解法!!!)

    编写一个程序,通过已填充的空格来解决数独问题. 一个数独的解法需遵循如下规则: 数字 1-9 在每一行只能出现一次. 数字 1-9 在每一列只能出现一次. 数字 1-9 在每一个以粗实线分隔的 3x3 ...

  10. Leetcode 1229:安排会议日程(超详细的解法!!!)

    你是一名行政助理,手里有两位客户的空闲时间表:slots1 和 slots2,以及会议的预计持续时间 duration,请你为他们安排合适的会议时间. 「会议时间」是两位客户都有空参加,并且持续时间能 ...

最新文章

  1. C# Socket系列三 socket通信的封包和拆包
  2. React Native 'config.h' file not found
  3. CDOJ 1070 秋实大哥打游戏 带权并查集
  4. 【每周CV论文推荐】 初学高效率CNN模型设计应该读的文章
  5. ubuntu declare
  6. [Windows]_[0基础]_[Release程序的崩溃报告minidump解决方式]
  7. adsl服务器客户端配置cisco_【干货】Cisco路由排错经典案例分析
  8. 数据分析之如何制作数据埋点文档
  9. mysql查询单表的销售额_MYsql数据库单表百万数据量查询
  10. python读取pdf文件 pdfplumber_Python pdfprumber用于PDF表提取,pythonpdfplumber,表格
  11. NHibernate从入门到精通系列(3)——第一个NHibernate应用程序
  12. hive中的集合操作函数
  13. 机器人系统常用仿真软件工具介绍、效果与评价指标(2018年更新)
  14. 从0到1,数据治理一周年大纪实
  15. 阿里P9手写的Java核心开发手册(2022版)覆盖P5到P8所有技术栈
  16. 多变量微积分笔记(2)——多元函数及其微分
  17. 电脑病毒怎么彻底清理?你不知道的8个方法
  18. GNU/Linux 初學之旅
  19. C++:实现量化Piecewise yield曲线测试实例
  20. DML、DDL、DCL区别 .

热门文章

  1. Web程序设计——ASP.NET实用网站开发(第四版)课后习题答案
  2. 依赖倒置原则——举例说明Java设计模式中的依赖倒置原则
  3. HTML文字描边像素,css怎么实现字体描边效果?
  4. 《复联 4》上映,来看看 GitHub 上这几个漫威项目!
  5. iastora怎么改成ahci_系统重装|电脑硬盘IDE修改为AHCI模式教程
  6. c语言中extern的使用
  7. 命令行启动mysql客户端_MySQL命令行客户端命令
  8. 苹果xsmax有高通基带吗_“爱情”走得太快:苹果或在2023年与高通正式“分手”|高通|英特尔|手机|基带...
  9. Linux下串口参数VTIME和VMIN的用法
  10. STM32F4与STM32F1的区别