倒置字符串(巧妙解法,超详细!!!)
目录
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;
}
倒置字符串(巧妙解法,超详细!!!)相关推荐
- 字符、字符串、字符流以及字符串函数的超详细讲解
前言 本文较为全面地总结了字符串的输入和输出,以及C++String类型常用函数等知识内容,其中包括对字符.字符数组.字符串.字 符串数组.字符串流的定义和输入输出的用法,对C/C++字符串的输入输出 ...
- c 获取char*的长度_C/C++编程笔记:C语言字符串比较函数,超详细,值得收藏
void *memset(void *dest, int c, size_t count); 将dest前面count个字符置为字符c. 返回dest的值. void *memmove(void *d ...
- c 获取char*的长度_C/C++编程笔记:C语言字符串比较函数,超详细,值得收藏!...
前方干货准备!!! void *memset(void *dest, int c, size_t count); 将dest前面count个字符置为字符c. 返回dest的值. void *memmo ...
- 如何比较字符串大小(超详细)
前言 在工作中,我们常遇到比较两个值的大小的需求,如果比较的值是"数字"大小,那不用说,三岁小孩也会吧.但是如果比较的是字符串的大小,那肯定还是有些不一样的.今天我就来整理整理,希 ...
- C语言字符、字符串函数(超详细版)
目录 strlen函数 三种方法模拟实现: 1.计数器: 2.指针 - 指针 3.函数递归 strcpy函数 strncpy函数 strcat函数 strncat函数 strcmp函数 strncmp ...
- 【C语言】字符串函数「超详细」
- Leetcode 1096:花括号展开 II(超详细!!!)
如果你熟悉 Shell 编程,那么一定了解过花括号展开,它可以用来生成任意字符串. 花括号展开的表达式可以看作一个由 花括号.逗号 和 小写英文字母 组成的字符串,定义下面几条语法规则: 如果只给出单 ...
- Leetcode 1162:地图分析(超详细的解法!!!)
你现在手里有一份大小为 N x N 的『地图』(网格) grid,上面的每个『区域』(单元格)都用 0 和 1 标记好了.其中 0 代表海洋,1 代表陆地,你知道距离陆地区域最远的海洋区域是是哪一个吗 ...
- Leetcode 37:解数独(超详细的解法!!!)
编写一个程序,通过已填充的空格来解决数独问题. 一个数独的解法需遵循如下规则: 数字 1-9 在每一行只能出现一次. 数字 1-9 在每一列只能出现一次. 数字 1-9 在每一个以粗实线分隔的 3x3 ...
- Leetcode 1229:安排会议日程(超详细的解法!!!)
你是一名行政助理,手里有两位客户的空闲时间表:slots1 和 slots2,以及会议的预计持续时间 duration,请你为他们安排合适的会议时间. 「会议时间」是两位客户都有空参加,并且持续时间能 ...
最新文章
- C# Socket系列三 socket通信的封包和拆包
- React Native 'config.h' file not found
- CDOJ 1070 秋实大哥打游戏 带权并查集
- 【每周CV论文推荐】 初学高效率CNN模型设计应该读的文章
- ubuntu declare
- [Windows]_[0基础]_[Release程序的崩溃报告minidump解决方式]
- adsl服务器客户端配置cisco_【干货】Cisco路由排错经典案例分析
- 数据分析之如何制作数据埋点文档
- mysql查询单表的销售额_MYsql数据库单表百万数据量查询
- python读取pdf文件 pdfplumber_Python pdfprumber用于PDF表提取,pythonpdfplumber,表格
- NHibernate从入门到精通系列(3)——第一个NHibernate应用程序
- hive中的集合操作函数
- 机器人系统常用仿真软件工具介绍、效果与评价指标(2018年更新)
- 从0到1,数据治理一周年大纪实
- 阿里P9手写的Java核心开发手册(2022版)覆盖P5到P8所有技术栈
- 多变量微积分笔记(2)——多元函数及其微分
- 电脑病毒怎么彻底清理?你不知道的8个方法
- GNU/Linux 初學之旅
- C++:实现量化Piecewise yield曲线测试实例
- DML、DDL、DCL区别 .
热门文章
- Web程序设计——ASP.NET实用网站开发(第四版)课后习题答案
- 依赖倒置原则——举例说明Java设计模式中的依赖倒置原则
- HTML文字描边像素,css怎么实现字体描边效果?
- 《复联 4》上映,来看看 GitHub 上这几个漫威项目!
- iastora怎么改成ahci_系统重装|电脑硬盘IDE修改为AHCI模式教程
- c语言中extern的使用
- 命令行启动mysql客户端_MySQL命令行客户端命令
- 苹果xsmax有高通基带吗_“爱情”走得太快:苹果或在2023年与高通正式“分手”|高通|英特尔|手机|基带...
- Linux下串口参数VTIME和VMIN的用法
- STM32F4与STM32F1的区别