009 说反话 (20)(20 分)
给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出。
输入格式:测试输入包含一个测试用例,在一行内给出总长度不超过80的字符串。字符串由若干单词和若干空格组成,其中单词是由英文字母(大小写有区分)组成的字符串,单词之间用1个空格分开,输入保证句子末尾没有多余的空格。
输出格式:每个测试用例的输出占一行,输出倒序后的句子。
输入样例:
Hello World Here I Come
输出样例:
Come I Here World Hello
思路分析:
先将输入的字符串整体逆序,然后从头扫描,如果遇到空格,则将本次空格到前一次空格的字符换逆序,扫描完成后,因为字符串是以“\0”结束的,所以需要将最后一个单词逆序。
代码:
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
#define MAX_LEN 80
char* reSort(char *c,int left,int right){
int mid = (left+right)/2;
//printf("%d\t%d\t%d\n",left,right,mid);
for(int i=0;i<=(mid-left);i++){
char temp = c[left+i];
c[i+left]=c[right-i];
c[right-i] = temp;
}
return c;
}
int main(){
char str[MAX_LEN];
char temp;
cin.getline(str,100);
reSort(str,0,strlen(str)-1);
int left=0;
for(int i=0;i<strlen(str);i++){
if(str[i] == ' '){
reSort(str,left,i-1);
left=i+1;
}
}
reSort(str,left,strlen(str)-1);
printf("%s\n",str);
return 0;
}
需要注意的地方:
1、参数的传递(这个内容过多,后期再重新补一篇帖子来讲述吧)
2、c++读取字符串的问题:
在pat中因为gets()不安全(虽然我也不知道有什么不安全的),所以禁用掉了。
而getchar()在读取过程中容易遇到乱码的问题。
最终选择了,cin.getline(str,length) 来读取字符串,length一般可以设置为一个很大的数,来确保确实读取了所有字符。
3、算法方面,在编写逆序函数的过程中遇到问题,注意上下限,注意“<=”。