PAT 【C语言】 说反话

给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出。

输入格式:
测试输入包含一个测试用例,在一行内给出总长度不超过500 000的字符串。字符串由若干单词和若干空格组成,其中单词是由英文字母(大小写有区分)组成的字符串,单词之间用若干个空格分开。

输出格式:
每个测试用例的输出占一行,输出倒序后的句子,并且保证单词间只有1个空格。

输入样例:
Hello World Here I Come
输出样例:
Come I Here World Hello
下面为我的代码


#include<stdio.h>
#include<string.h>
main()
{
    char s[500001];
    int  a[500001];
    memset(s,0,sizeof(s));
    memset(a,0,sizeof(a));
    gets(s);
    int n;
    for(int i=0;s[i]!=0;i++)
    {
        a[i]=(int)s[i];
        n++;
    }
    int m=0;
    int b[500001];
    memset(b,0,sizeof(b));
    for(int i=0;i<n;i++)
    {
        if(a[i]>='A'&&a[i]<='Z')
        {
            b[m]=i;
            m++;
        }
    }
    for(int i=m-1;i>=0;i--)
    {
        for(int j=b[i];a[j]!=' '&&a[j]!=0;j++)
        {
            printf("%c",s[j]);
        }
        if(i!=0)
        {
        printf(" ");
        }
    }
}

img


最后这个不懂是什么意思

单词之间用若干个空格分开。
连续大写字母是一个单词的情况就不行了
在你的代码基础上改了一下

#include<stdio.h>
#include<string.h>
int main()
{
    char s[500001];
    int  a[500001];
    memset(s,0,sizeof(s));
    memset(a,0,sizeof(a));
    gets(s);
    int n;
    for(int i=0;s[i]!=0;i++)
    {
        a[i]=(int)s[i];
        n++;
    }
    int m=1;
    int b[500001];
    memset(b,0,sizeof(b));
    for(int i=0;i<n;i++)
    {
        if(a[i]==' ')
        {
            b[m]=i;
            m++;
        }
    }
    b[m]=n;
    for(int i=m-1;i>0;i--)
    {
        for(int j=b[i]+1;j<b[i+1];j++)
        {
            printf("%c",s[j]);
        }
        if(i!=0)
        {
        printf(" ");
        }
    }
    for(int j=b[0];j<b[1];j++){
        printf("%c",s[j]);
    }
}

比较变态的测试用例。前面25万个字符作为一个单词,后面每个单词就一个字符

我不知道你为什么要搞个int型的数组来存中间结果
实际上你从后往前遍历,每遇到一个空格就把整个单词拿出来放进输出句子里
一共只需要两个char[]