这里想跟大家谈一谈pta上的一个编程题,说反话的加强版,这道题题目很好理解,可是编程的思路却十分难找,代码更是难以看懂。这里我想跟大家分享一种思路,并做出详细的分析。

#include<stdio.h>
#include<string.h>
void reverse(char *left, char *right)  //用来逆序的
{while (left < right){char temp = *left;*left = *right;*right = temp;left++;right--;}
}
int main()
{char a[100] = { 0 };scanf("%[^\n]c", a);int len = strlen(a);reverse(a, a + len - 1);char *star = a;char *end = a;while (*end != '\0'){end = star;while (*end != ' '&&*end != '\0'){end++;}reverse(star, end - 1);if (*end != '\0'){star = end + 1;}}printf("%s", a);
}

文章目录

  • reverse函数(逆序用的)
  • 主函数

reverse函数(逆序用的)


这里定义了一个用来把一组字符逆序的函数。
left对应的是字符的首地址,right对应的是字符的右地址,而下面的while循环就是很经典的交换两个变量的值的函数。只有两个变量x*left*right是无法互相转换的,必须引入一个新变量temp,把*left的值存到temp里,把*right的值存到*left里,这就完成了第一步,*left变成*right。第二步是把 *right变成*left*left在之前存到temp里,所以把temp赋值给*right,就相当与把*left赋值给了*right。然后地址left和地址right分别缩进一格,直到下面这个结果。

这两种结果都是结束循环的条件。

主函数

1.char a首先定义一个数组a
2.scanf由键盘输入
3.int len=字符长度 strlen()用来计算指定的字符串s 的长度,不包括结束字符"\0"(不是内存长度,内存长度要+1)。【返回值】返回字符串s 的字符数。
4.用reverse函数把输入的整个字符串顺序反过来
5.定义指针变量star和end都指向a数组的首地址
接下来就是这段程序的精髓所在
先不管while (*end != ‘\0’)
end = star;也等会再说

上面的是运行结果

while (*end != ' '&&*end != '\0'){end++;}

这里其实是把地址end一直推到空格或结束(都要判断),一般会推到空格,前面已经倒序了整个字符串,所以是uoy evol i dlrow elloh,这时候框的是uoy和一个空格,所以下面要对u空格前面一个字符y进行倒序(reverse),变成you

reverse(star, end - 1);if (*end != '\0'){star = end + 1;}

如果刚才假定的地址end(空格)不是结束,那么地址star跳到空格后一位(字符位),万一空格后还是空格怎么办?又从头开始循环end跳到star位置(空格),star=end+1和end=star(两个都推进)会把最终end推到空格位,star推到字符位。(这里是特殊情况)
再次从头循环把end推到空格位,star和end-1就又框出了一个倒序的单词,再用reverse倒序就回到了正常顺序(love)。

梳理一下,star和end是字符数组首地址(第1字符位)
1.把end推到空格位(n+1),用star(1)和end-1(n)框出倒序过的字符再倒序(reverse)
2.把star推到end后的字符位(第1字符位),再end=star(字符位)

第二步其实就是调整star和end的位置
至于为什么要这样调,是因为一个变量通过循环判断不能由空格跳到字符后的下一个空格,只能先判断到字符,跳到字符,再判断到空格,跳到空格。
第一步框好了一个单词(字符到空格),再reverse。
第二步的star要跳到字符,只需要由end(空格)跳到下一个字符。而end(空格)要跳到下一个空格,就需要先跳到star(字符)因为字符后可能还是字符,再跳到空格(第一步),因为字符后可能还是字符。这就解释了end=star这个代码的作用

再解释判断条件
第一个reverse完后,if(如果)end是结束的位置,那么直接else,star变成end(结束)再由第一个while,star为结束而结束。

最后输出字符

画此图以帮助理解

这里分享一种理解记忆这段代码的方式
1.首先,我们知道star是字符位,要让end到字符位直到空格位,就是end=star再空格结束循环。
2.框好单词后用个reverse
3.把star弄到下一个空格后的字符位(star = end + 1;),但要先判断end是不是空格
4. 如果end不是空格,是结束,用总的(第一行)while结束循环

原创不易,关注一下呗!

c语言 PTA 基础编程题目集 编程题 7-32 说反话 加强版 的分析相关推荐

  1. 基础编程题目集 编程题部分

    文章目录 7-1 厘米换算英尺英寸 (15分) 7-2 然后是几点 (15分) 7-3 逆序的三位数 (10分) 7-4 BCD解密 (10分) 7-5 表格输出 (5分) 7-6 混合类型数据格式化 ...

  2. 【基础编程题目集编程题及其答案】

    python江湖 7-1 厘米换算英尺英寸~15 题解: 7-2 然后是几点~15 题解: 7-3 逆序的三位数~10 题解: BCD解密~10 题解: 7-5 表格输出~5 题解: 7-6 混合类型 ...

  3. PTA —— 基础编程题目集 —— 编程题 —— 7-1 厘米换算英尺英寸 (15 分)

    题目 如果已知英制长度的英尺foot和英寸inch的值,那么对应的米是(foot+inch/12)×0.3048.现在,如果用户输入的是厘米数,那么对应英制长度的英尺和英寸是多少呢?别忘了1英尺等于1 ...

  4. PTA —— 基础编程题目集 —— 编程题 —— 7-2 然后是几点 (15 分)

    题目 有时候人们用四位数字表示一个时间,比如1106表示11点零6分. 现在,你的程序要根据起始时间和流逝的时间计算出终止时间. 读入两个数字, 第一个数字以这样的四位数字表示当前时间, 第二个数字表 ...

  5. PTA —— 基础编程题目集 —— 编程题 —— 7-3 逆序的三位数 (10 分)

    题目 程序每次读入一个正3位数,然后输出按位逆序的数字.注意:当输入的数字含有结尾的0时,输出不应带有前导的0.比如输入700,输出应该是7. 输入格式: 每个测试是一个3位的正整数. 输出格式: 输 ...

  6. 基础编程题目集 函数题部分

    6-1 简单输出整数 分数 10 全屏浏览题目 切换布局 作者 陈越 单位 浙江大学 本题要求实现一个函数,对给定的正整数N,打印从1到N的全部正整数. 函数接口定义: void PrintN ( i ...

  7. PTA-基础编程题目集-函数题 ……

    -- Java 7-26 单词长度 -- C 6-1 简单输出整数 6-2 多项式求值 6-3 简单求和 6-4 求自定类型元素的平均 6-5 求自定类型元素的最大值 6-7 统计某类完全平方数 6- ...

  8. PTA 基础编程题目集 7-27 冒泡法排序 C语言

    PTA 基础编程题目集 7-27 冒泡法排序 C语言 将N个整数按从小到大排序的冒泡排序法是这样工作的:从头到尾比较相邻两个元素,如果前面的元素大于其紧随的后面元素,则交换它们.通过一遍扫描,则最后一 ...

  9. PTA 基础编程题目集 7-33 有理数加法 C语言

    PTA 基础编程题目集 7-33 有理数加法 C语言 本题要求编写程序,计算两个有理数的和. 输入格式: 输入在一行中按照a1/b1 a2/b2的格式给出两个分数形式的有理数,其中分子和分母全是整形范 ...

最新文章

  1. python视频口碑佳_从万众期待到口碑扑街!用Python来分析一下大家对唐探3的评论...
  2. python with方法
  3. 中国蚁剑 代码解压出错:【object Object】解决方法
  4. 简述JAVA线程调度的原理,Rxjava原理(二)--线程调度
  5. 数据挖掘——相似文章推荐
  6. 使用proguard混淆java web项目代码
  7. 基姆拉尔森计算公式(算任意日期是星期几)
  8. LeetCode 1116. 打印零与奇偶数
  9. 编写shell脚本实现tomcat定时重启的方法
  10. 群晖消息通知 推送服务器,群晖NAS发送钉钉群消息通知教程
  11. MySQL规范「索引规范」码出高效,码出质量 - 第399篇
  12. 魔兽世界单机服务器物品查询,魔兽世界单机版gm命令-物品代要码大全.doc
  13. 关于Hbase手动实现Major Compact的办法
  14. tomcat两种启动方式
  15. Web大学生网页作业成品:基于html制作中国科技发展网站设计题材【航天之路7页】HTML+CSS+JavaScript
  16. Jenkins构建时间变量
  17. 数学分析 曲面积分与场论初步(第22章)
  18. csapp程序人生大作业
  19. 按关键字搜索淘宝商品
  20. 想要安装pdf虚拟打印机64位应如何实现

热门文章

  1. 数字图像处理知识点梳理——第八章 图像压缩
  2. openwrt 显示系统运行时间和空闲时间
  3. FL Studio教程之排列和编辑歌曲
  4. Python之父:Python 4.0可能不会有了
  5. 数据分析+数据挖掘暑期实习碎碎念
  6. springmvc对json数据的处理
  7. maplesim matlab,maple
  8. 3GPP TS 23501-g51 中英文对照 | 4.3.4 Interworking between ePDG connected to EPC and 5GS
  9. Windows Server 2008 防火墙开放 Oracle 的1521端口
  10. MySQL查看数据库状态命令详解