作者的话:若有朋友复制代码去PAT试着运行遇到问题的:
1.可能是格式问题,可以先把从本站复制的代码粘贴到记事本,再把记事本里的代码复制,然后粘贴到PAT的代码区,提交本题回答,应该就可以了;
2.可能是注释原因,PAT有时候检测到注释会编译错误,所以可以先把注释删了,再进行提交回答。
3.可能是作者当初根据题目写出来的代码仍存在一些疏漏,而恰好当时的测试机制没那么完善,没检测出问题。后面测试机制有所更新,故出现问题,若有相关需要的可以评论区留言或私信作者,我看到的话会去再查一下疏漏之处,然后更新文章。

一、题目描述
给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出。
输入格式:
测试输入包含一个测试用例,在一行内给出总长度不超过 80 的字符串。字符串由若干单词和若干空格组成,其中单词是由英文字母(大小写有区分)组成的字符串,单词之间用 1 个空格分开,输入保证句子末尾没有多余的空格。
输出格式:
每个测试用例的输出占一行,输出倒序后的句子。
输入样例:
Hello World Here I Come
输出样例:
Come I Here World Hello

二、解题思路
读题:

接收一串总长度不超过80的字符串(字符串为单词+空格+单词+…的形式),将单词的排列顺序颠倒输出。
思路:
1.定义需要的变量(实际解题时是先定义认为需要用到的变量,后面遇到问题需要新定义变量时再回到上头来定义新的变量),利用循环从键盘接收整个字符串存储在字符数组a中;
2.利用循环和判断语句从后往前遍历整个字符数组,以空格和换行符为判断条件,打印空格和空格之间、空格和换行符之间的一连串字符(因为是从后往前遍历,所以打印顺序是先打印最后一个单词,再打印前面一个单词,以此类推)。打印完一个单词后,再打印一个空格字符;
3.打印字符串的第一个单词(字符串的第一个单词由于并不被空格、字符串包围,所以思路2并不会打印第一个单词)。

三、具体实现
0.标准C源程序框架

#include <stdio.h>
int main()
{return 0;
}

1.定义需要的变量(实际解题时是先定义认为需要用到的变量,后面遇到问题需要新定义变量时再回到上头来定义新的变量),利用循环从键盘接收整个字符串存储在字符数组a中;

 char a[82];int i = 0;int j = 0;do{scanf("%c",&a[i++]);} while (a[i-1] != '\n');

2.利用循环和判断语句从后往前遍历整个字符数组,以空格和换行符为判断条件,打印空格和空格之间、空格和换行符之间的一连串字符(因为是从后往前遍历,所以打印顺序是先打印最后一个单词,再打印前面一个单词,以此类推)。打印完一个单词后,再打印一个空格字符;

 for (; i > 0; i--){if (a[i - 1] == ' '){j = i;while ((a[j]!=' ')&&(a[j]!='\n')){printf("%c", a[j++]);}printf(" ");}}

3.打印字符串的第一个单词(字符串的第一个单词由于并不被空格、字符串包围,所以思路2并不会打印第一个单词)。

 while ((a[i] != ' ') && (a[i] != '\n')){printf("%c", a[i++]);}

四、全部代码

#include <stdio.h>
int main()
{//目标:hello world\n -> world hello//我最先想到的是创建二维数组a[80][80],一行代表一个单词,可是数组内容学的不到家,弄了半天没弄好,只能回归一维数组char a[81];//后面接收字符串时,会存储输入的一连串字符加回车字符,所以考虑最坏的情况,数组必须能存储81个字符int i = 0;//循环变量,挺多地方用到的int j = 0;do{scanf("%c",&a[i++]);//一轮循环接收一个字符,直到接收到换行符,循环结束,此时i的值比接收了换行符的元素的下标大1} while (a[i-1] != '\n');for (; i > 0; i--)//从后往前遍历{if (a[i - 1] == ' ')//当当前元素的前面一个元素是空格时,执行分支{         //这个分支用来将空格和空格/换行符之间的一连串字符(单词)和空格打印出来j = i;//打印完一个单词后,i还要继续向前遍历,所以要保留i的值,但又要打印后面几位元素的值while ((a[j]!=' ')&&(a[j]!='\n'))//所以我们用j复制i的值,用j来打印后面几位元素的值{    //while循环,除非a[j]为空格/换行符,否则一直执行循环体,逐个打印空格后面的字符printf("%c", a[j++]);}printf(" ");//用来打印一个单词的循环结束,根据题意需要打印一个空格}}while ((a[i] != ' ') && (a[i] != '\n')){printf("%c", a[i++]);}return 0;
}

五、优化代码
PAT上很多题目被我以前老师拿来给我们布置作业,可惜那个时候我不认真,代码都是网上复制粘贴的。接下来这个代码就是我以前拷贝来的,出处已经找不到了,但我觉得比我写的更有水平,拿出来给大家参考一下。

#include <stdio.h>
int main()
{char a[80][80];//定义二维数组,后面会一行存储一个单词int i = 0;do {scanf("%s", a[i++]);//scanf("%s")遇到空白符(空格,tab,\n)会停止接收,并且空格留在输入缓存区中} while (getchar()!='\n');//getchar()用于接收空格,当它接收到换行符时说明字符串输入结束,故终止循环while (--i)//当前a[i]在最后一个单词所在行的后面一行,是一个空白行,所以需要先自减,再使用i打印最后一个单词,然后依次往前{printf("%s ",a[i]);}printf("%s", a[i]);//当i为0时(a[0]为第一个单词所在行)上述循环结束,并没有打印第一个单词,所以在这里打印return 0;
}

C语言PAT刷题 - 1009 说反话相关推荐

  1. C语言PAT刷题 - 1020 月饼

    作者的话:若有朋友复制代码去PAT试着运行遇到问题的: 1.可能是格式问题,可以先把从本站复制的代码粘贴到记事本,再把记事本里的代码复制,然后粘贴到PAT的代码区,提交本题回答,应该就可以了: 2.可 ...

  2. C语言PAT刷题 - 1019 数字黑洞

    作者的话:若有朋友复制代码去PAT试着运行遇到问题的: 1.可能是格式问题,可以先把从本站复制的代码粘贴到记事本,再把记事本里的代码复制,然后粘贴到PAT的代码区,提交本题回答,应该就可以了: 2.可 ...

  3. C语言PAT刷题 - 1027 打印沙漏

    作者的话:若有朋友复制代码去PAT试着运行遇到问题的: 1.可能是格式问题,可以先把从本站复制的代码粘贴到记事本,再把记事本里的代码复制,然后粘贴到PAT的代码区,提交本题回答,应该就可以了: 2.可 ...

  4. C语言PAT刷题 - 1023 组个最小数

    作者的话:若有朋友复制代码去PAT试着运行遇到问题的: 1.可能是格式问题,可以先把从本站复制的代码粘贴到记事本,再把记事本里的代码复制,然后粘贴到PAT的代码区,提交本题回答,应该就可以了: 2.可 ...

  5. C语言PAT刷题 - 1032 挖掘机技术哪家强

    作者的话:若有朋友复制代码去PAT试着运行遇到问题的: 1.可能是格式问题,可以先把从本站复制的代码粘贴到记事本,再把记事本里的代码复制,然后粘贴到PAT的代码区,提交本题回答,应该就可以了: 2.可 ...

  6. C语言百日刷题第七天

    C语言百日刷题第七天 61. 写一个函数isPowerOfTwo判断是不是2的幂次方 62. 写一个函数isPowerOfThree判断是不是3的幂次方 63.n 的第 k 个因子 64.有效的完全平 ...

  7. PAT刷题之乙级1033 旧键盘打字

    目录 PAT刷题之乙级1033(cpp) 题目描述 输入格式 输出格式 输入样例 输出样例 问题分析 代码实现 运行实现 PAT刷题之乙级1033(cpp) 题目描述 旧键盘上坏了几个键,于是在敲一段 ...

  8. C语言百日刷题第二天

    C语言百日刷题第二天 11. 统计输入数据的正负个数 12.学生基本信息输入输出 13.杨辉三角的前n行 14.模拟用户登录情景 15.演示多个字符从两端移动,向中间汇聚 16.计算短信费用 17.编 ...

  9. C语言百日刷题第十三天

    前言 今天是刷题第13天,放弃不难,但坚持一定很酷~ 临近期末,再刷一套模拟题 C语言百日刷题第十三天 前言 选择题 判断题 编程题 选择题 1.若由定义int*p1,*p2,m=5,n;以下赋值语句 ...

最新文章

  1. 计算机系统崩溃重新装机,当计算机系统崩溃时如何用U盘重新安装Win7系统
  2. pickle与cpickle的用法
  3. 如何让touchmove之后不触发touchend的事件
  4. ITextSharp导出PDF表格和图片(C#)
  5. oracled update_oracle中要谨慎使用update交叉更新!
  6. diy gps for mio 686
  7. 盛大 传奇 的网游启示录
  8. truncate table(截断表)
  9. linux下这输入法切换大小写,Life With Arch:让Capslock成为输入法切换快捷键
  10. 用python实现PR对视频处理的基本操作
  11. 计算机一级exc除法函数,excel除法函数 excel除法如何表示
  12. 幼儿园网络图怎么绘制_幼儿园主题网络图的绘制要注意什么
  13. [CSP-S模拟测试]:赤壁情(DP)
  14. ​分享 17 款你可能会用的上 Chrome 插件
  15. 企业微信批量导入用户
  16. 进制为2的10次方的世界
  17. 我的世界服务器显示弹幕,[娱乐]RaiixDM —— 在mc中接收b站直播弹幕[1.12.x-1.15.x]...
  18. RGB接口屏和SPI接口屏的引脚
  19. 01 KVM虚拟化简介
  20. Android手机中获取手机号码和运营商信息

热门文章

  1. 雷达和RGB相机对齐的核心代码crop
  2. ensp企业网综合实验(课程设计)
  3. python excel创建kml文件
  4. 颜值、影像大升级?OPPO Reno7优缺点一文看懂
  5. 出局者高调给小程序泼冷水 为什么说2019年的小程序仍是大有可为?
  6. Limo机器人教程-产品简介1
  7. Nginx 代理解决前端跨域问题
  8. 分享一款超高颜值的Idea插件——Material Theme UI !!!快来看看
  9. Flutter:究竟是大势所趋还是昙花一现?
  10. (附源码)基于vue框架潮牌官网设计与实现 毕业设计010955