题目
给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出。
输入格式:
测试输入包含一个测试用例,在一行内给出总长度不超过 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.知道了读到文件末尾时是会把一个空格给读入的(如果有空间可以存放的话)