给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出。
输入格式:
测试输入包含一个测试用例,在一行内给出总长度不超过500 000的字符串。字符串由若干单词和若干空格组成,其中单词是由英文字母(大小写有区分)组成的字符串,单词之间用若干个空格分开。
输出格式:
每个测试用例的输出占一行,输出倒序后的句子,并且保证单词间只有1个空格。
输入样例:
Hello World Here I Come
输出样例:
Come I Here World Hello
代码如下
#include<stdio.h>
#include<string.h>
void reverse(char* start, char* end)
{
char t;
for(;start < end; start++, end--)
{
t = *start;
*start = *end;
*end = t;
}
}
int main()
{
char ch[500001];
gets(ch);
int len = strlen(ch);
reverse(ch, ch+len-1);//整个字符串全部逆置
//对每个单词逆序
char* start = ch;
while(*start != '\0')
{
char* end = start;
while(*end != ' ' && *end != '\0')
{
end++;
}
reverse(start, end - 1);
while(*end == ' ' && *end != '\0')
{
end++;
}
start = end;
}
int count = 0, i = 0;
while(ch[i] != '\0')
{
if(ch[i] != '\0' && ch[i] != ' ' && (ch[i+1] == ' ' || ch[i+1] == '\0'))//用来判断ch[i]为单独字母或单词的最后一个字母
{
count++;
}
i++;
}
if(count == 1 || count == 0)//处理只有一个词,末尾有空格;最小词前有空格;只有空格的特殊情况.
{
for(i = 0; i < len ; i++)
{
if(ch[i] != ' ')
{
printf("%c", ch[i]);
}
}
}
else
{
//指针都指向第一个字母
start = ch;
char* end = start;
while(*start != '\0')
{
while(*end != ' ' && *end != '\0')
{
printf("%c", *end);
end++;
}
if(*end != '\0')//一个单词结束输出空格
{
printf(" ");
}
while(*end == ' ')//处理单词之间有多个空格的情况
{
end++;
}
start=end;//把end传给start用于while循环进行判断是否终止循环
}
}
return 0;
}