一、 题目
给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出。
输入格式:
测试输入包含一个测试用例,在一行内给出总长度不超过 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;
}