一、 题目
给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出。输入格式:
测试输入包含一个测试用例,在一行内给出总长度不超过 80 的字符串。字符串由若干单词和若干空格组成,其中单词是由英文字母(大小写有区分)组成的字符串,单词之间用 1 个空格分开,输入保证句子末尾没有多余的空格。输出格式:
每个测试用例的输出占一行,输出倒序后的句子。输入样例:
Hello World Here I Come
输出样例:
Come I Here World Hello
二、代码
- 核心函数
- 未使用的getline(cin, str2); 此函数直接读入输入的一行到str2字符数组中,包含换行符、空格!!注意使用的是char数组,不是string(也就是说ACM中直接读入一行未知何时结束的数据的时候,这种方法可以奏效;读入一行后自动运行下面的代码)
- getchar: 读入一个字符,包含换行符,空格。
- 上面的两个关键方法就是来解决 输入不知道何时终结的字符的方法!!!!!
-
分析
1) 我原来想法: 我原来打算使用string数组来做,结果发现无法判断何时结束输入,’\n’只是字符,string压根不识别!!
2) 本题采用了定义数组来记录空格的方法求解。 空格与空格之间的间隙就是每个单词。
3)因为要满足每个单词前后都有空格,所以第一个单词的前面和最后一个单词的后面都要加一个空格,这样所有单词的处理就会一致。 for(i=strSign[k-1]+1; i<strSign[k]; i++) 。 从前一个空格下一个开始读,到下一个空格的前一个结束。。 -
易错点
1) 注意在第一个单词前面和最后一个单词的后面都要添加空格
2)不要忘记,最后输入没有空格
#include <iostream>
#include <stdio.h>
using namespace std;int main() {char str[200];char strSign[100] = {0};strSign[0] = -1;//string str2;int i=0, j=1, k;//getline(cin, str2); //geline读入一行数据,而且读入的是字符串string,不是char 不包含换行符!!!! char c;while(1) {c = getchar();if(c == '\n') {break;}if(c == ' ') {strSign[j] = i;j++;}str[i] = c;i++;//cout<<c;}str[i] = ' ';strSign[j] = i;for(k=j; k>=1; k--) {for(i=strSign[k-1]+1; i<strSign[k]; i++) {cout<<str[i];}if(k != 1) {cout<<" ";}}return 0;
}
后补第二种方法!!!
- 核心函数
- 用的char的二维数组!!! 二维数组的行数、列数只要大于就行!!!
- 因为题目的例子是一段字符串!!在测试的时候,系统自己会自动中断输入!
cin是以空格为分隔符的!!将几个字符串分开 - 在自己测试的时候,要用crtl + Z 中断输入!!!
#include <iostream>
using namespace std;int main() {char str[20][80];int i=0;while(cin>>str[i]) {i++;}for(int j=i-1; j>=0; j--) {if(j!=i-1) cout<<" ";cout<<str[j]; }return 0;
}