#include <stdio.h>
#include <string.h>
int main()
{
char s[600000];
scanf("%[^\n]",s);
int lword = 0;
char*p = s;
char buf[10];
int n = 1;
int eye = 0;//为最后字符为空格的情况插眼
int len = strlen(s);
for(int i=0;i<len;i++){
if(s[i]==' '&&s[i+1]==' '){
for(int j=i;j<len;j++){
*(p+j) = *(p+j+1);
i--;//出现多空格时退一位再检查一遍
}
}
}//此模块用于消除字符串多余空格,只保留一个
int len0 = strlen(s);
for(int i=len0;i>=0;i--){
while(s[i]!=' '){
lword++;
break;
}//由空格情况记录每个单词长度
if(s[i]==' '){
for(int k=i+1;lword!=0;k++){
if(s[k]!='\0'){
printf("%c",s[k]);
eye = 1;//插眼,说明输入时最后不是空格
}
lword--;
}
if(i>0&&eye==1)
printf(" ");
} //从每个由后向前的单词的第一位开始逐个字母输出 ,并在必要时加空格
if(i==0){
for(int j=0;s[j]!=' ';j++){
printf("%c",s[j]);
}
}//第一个单词前没有空格了,所以加此if
} //说反话模块
return 0;
}
给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出。
输入格式:
测试输入包含一个测试用例,在一行内给出总长度不超过500 000的字符串。字符串由若干单词和若干空格组成,其中单词是由英文字母(大小写有区分)组成的字符串,单词之间用若干个空格分开。
输出格式:
每个测试用例的输出占一行,输出倒序后的句子,并且保证单词间只有1个空格。
反思:
1.直接按情况printf字符比转变字符串更容易
2.当数据量较大(500000)时不宜采用二维字符串数组
3.对于插眼的位置与方式,应在考虑到特殊情况时逐步小心调试,不可操之过急