问题
给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出。
输入格式:
测试输入包含一个测试用例,在一行内给出总长度不超过 80 的字符串。字符串由若干单词和若干空格组成,其中单词是由英文字母(大小写有区分)组成的字符串,单词之间用 1 个空格分开,输入保证句子末尾没有多余的空格。
输出格式:
每个测试用例的输出占一行,输出倒序后的句子。
输入样例:
Hello World Here I Come
输出样例:
Come I Here World Hello
解决方法
string
分析:字符串处理
#include<iostream>
#include<string>
using namespace std;
int main()
{
int num = 0;
string s[90];
string t;
while (cin >> t)
{
s[num] = t;
num++;
}
for (int i = num - 1; i >= 0; i--)
{
if (i != num - 1) cout << " ";
cout << s[i];
}
return 0;
}
其中值得注意的是:
♦while (cin >> t)
这行代码的意思是只要有输入,while就不会停止。停止的是cin,cin遇到空格,回车,换行等停止。
♦对于string类型的数据,输入不能用scanf只能用cin,因为string在c++中是一个对象,而不是基本的基本的数据类型。
♦cin是c++的标准输入流的一个对象,它是没有返回值的。出现while(cin>>a)的调用,这里并不是cin的返回值,返回的是cin本身的值(非0),只有遇到EOF时,返回0;
字符数组
#include<cstdio>
int main()
{
int num = 0;
char a[90][90];
while (scanf("%s", a[num]) != EOF) num++;
for (int i = num - 1; i >= 0; i--)
{
if (i != num - 1) printf(" ");
printf("%s", a[i]);
}
return 0;
}
♦#include< cstdio>这个头文件是c++中的头文件,是将stdio.h这个头文件在c++中重写了。头文件带c的意思就是C语言中的头文件。也可以用iostream这个是更强大的输入输出。
♦EOF代表end of file ,EOF的值为-1。while (scanf("%s", a[num]) != EOF)
这里比较的是scanf的值和EOF的值,如果成功读入一个值,那么返回1,两个则返回2.如果读到文件末尾,没有数据读入,那么就是-1.
stack
分析:因为这个是逆序输出,我们可以用stack(first in,last out)的特性来实现。
#include<iostream>
#include<stack>
#include<string>
using namespace std;
int main()
{
string s;
stack<string>v;
while (cin >> s) v.push(s);
cout << v.top();
v.pop();
while (!v.empty())
{
cout << " " << v.top();
v.pop();
}
return 0;
}
string+vector
#include<string>
#include<iostream>
#include<vector>
using namespace std;
vector<string>V;
int main()
{
string s;
getline(cin, s);
while (s.find(' ') != string::npos)
{
V.push_back(s.substr(0, s.find(' ')));
s.erase(s.begin(), s.begin() + s.find(' ')+1);
}
cout << s;
for (auto it = V.rbegin(); it != V.rend(); it++) cout <<" "<< *it;
return 0;
}
后记
在VS2017中跑解法一二三,需要用到ctrl+z+enter来停止编译。这个要注意。