pat(乙)1009 说反话 (20 分)

题目
给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出。

输入格式:
测试输入包含一个测试用例,在一行内给出总长度不超过 80 的字符串。字符串由若干单词和若干空格组成,其中单词是由英文字母(大小写有区分)组成的字符串,单词之间用 1 个空格分开,输入保证句子末尾没有多余的空格。

输出格式
每个测试用例的输出占一行,输出倒序后的句子。

输入样例:
Hello World Here I Come

输出样例:
Come I Here World Hello

思路:
用cin.getline()读取一行字符,以空格为分隔符来划分单词,依次将单词读入二维数组,最后逆序输出二维数组输入的单词

AC代码:

#include<cstdio>
#include<cstring>
#include<iostream>
//#include<algorithm>
//#include<vector>
using namespace std;
const int MAX = 90;

int main()
{
	char str[MAX];
	//gets(str); 要使用gets必须把头文件全换成c语言配套的,并且把所有c++头文件注释掉,例如cstdio-->stdio.h,否则在pat上无法通过
	cin.getline(str,MAX);          
	char ans[MAX][MAX];
	int len = strlen(str),r = 0,c = 0;  //r是行,c是列 
	for(int i = 0;i < len; i++){
		if(str[i] != ' '){
			ans[r][c++] = str[i];
		}else{          //是空格就给这个单词加个结束符 
			ans[r][c] = '\0';
			r++;
			c = 0;
		} 
	}
	ans[r][c] = '\0';   //最后一个单词没有空格,需要手动补一个结束符 
	for (int i = r; i >= 0; i--) {  //按行逆序输出单词 
		printf("%s", ans[i]);
		if (i > 0) printf(" ");     //最后一个单词不需要空格 
	}
	return 0;
}

既然本质上就是对二维数组存储再读出,那为什么不直接读入到二维数组呢,于是有了下面第二种更简洁的代码:

#include<cstdio>
#include<cstring>
//#include<iostream>
//#include<algorithm>
//#include<vector>
//using namespace std;
const int MAX = 90;

int main()
{
	char ans[MAX][MAX];
	int num = 0;
	//需要手动Ctrl+Z来结束输入,oj测试时输入完会默认输入Ctrl+Z的 
	while(scanf("%s",ans[num]) != EOF){ //不要直接写成while(scanf("%s",ans[num++]) != EOF); 
		num++;                          //结果开头会多打印个空格,把Ctrl+Z作为空格输入到ans[num-1] 
	}                                   //注意把握num自增和判断是否在文件末尾的顺序 
	for (int i = num - 1; i >= 0; i--) {   
		printf("%s", ans[i]);
		if (i > 0) printf(" ");     //最后一个单词不需要空格 
	}
	return 0;
}

教训与收获:
1.我最初的想法是对已读取的字符串进行从后往前分割,结果没完全实现出来,很麻烦,没想到用二维数组来存储这么轻易就解决了,还是题目刷的太少,下次知道了,想要把一个字符串当成一个数据元素的要使用二维数组
2.知道了gets的使用场景,毕竟是c的函数要和头文件配套,而c++有自己封装的读取一行的函数cin.getline()
3.知道了单词是以空格来判断的
4.知道了读到文件末尾时是会把一个空格给读入的(如果有空间可以存放的话)

上一篇:搭建域环境,安装Exchange Server 2013,复现CVE-2019-1040


下一篇:1040 Longest Symmetric String (25 分)