103. 反转单词
时间限制 1000 ms
内存限制 65536 KB
题目描述
给出一句英文句子(只由大小写字母和空格组成,不含标点符号,也不会出现连续的空格),请将其中的所有单词顺序翻转
输入格式
多组数据,以EOF结束。
每行一句英文句子(确保只由大小写字母和空格组成,不含标点符号,也不会出现连续的空格,字符串总长度1000以内)
输出格式
每组数据输出一行,为反转后的字符串
输入样例
It is a apple
输出样例
apple a is It
思路:
1. 从后向前,依次对每个单词进行反转,以空格作为一个单词的结束符。
2. 每次输出单词时,以上一次的空格tmp为结束符(包括tmp),初始时tmp一定要等于字符串的长度,这样确保tmp初试时就为'\0', 因为为字符串的结束符就是'\0'. 这样便于后面的输出。
3. 本题要求是对句子中的每个单词反转,句子中间含有空格,因此输入时不能用scanf函数,只用用gets函数
4. scanf 和 gets 函数的区别:
scanf在读入字符串时,遇到空格和回车都会停止输入,并将空格和回车clear.
而gets函数会接受空格这个字符,遇到回车停止,并自动清除回车
AC代码:
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
char str[1005];
int main(){
while(gets(str)!=NULL){
//gets()会将回车读入,并自动去掉回车
int tmp = strlen(str); //tmp用来记录空格的位置
for(int i=tmp;i>=0;i--)
{
if(str[i]==' ')
{
for(int j=i+1;j<=tmp;j++)
cout<<str[j];
tmp=i;
}
}
//对倒序最后一个单词(正序的第一个单词)的输出特殊处理一下
for(int k=0;k<tmp;k++) //注意这里不用加等号,最后一个不要空格
cout<<str[k];
cout<<'\n';
}
return 0;
}