题目

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

输入格式:

测试输入包含一个测试用例,在一行内给出总长度不超过 80 的字符串。字符串由若干单词和若干空格组成,其中单词是由英文字母(大小写有区分)组成的字符串,单词之间用 1 个空格分开,输入保证句子末尾没有多余的空格。

输出格式:

每个测试用例的输出占一行,输出倒序后的句子。

输入样例:

1
Hello World Here I Come

输出样例:

1
Come I Here World Hello

鸣谢用户 无影 修正数据!

思路

只用一个字符串,从后向前搜索单词,依次输出。

评: 用高级语言的栈就轻松的多了(所以我觉得C++确实很适合PAT);为了将末尾的换行也跳过,我用了isspace,这样一来输入格式变得很宽松,任何空白字符分隔的单词都能接受。

下面的代码是我之前的代码,是不断修改过的结果,最后改成了一个很具有“C Bible”风格的代码(可能是这本书看多了(⊙﹏⊙)b)。只用很基本的函数,很多功能自己来实现,所以可读性就比较差——但是我觉得挺有意思的(*^__^*)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/* 目前代码请看最后。*/

#include <stdio.h>
#include <ctype.h>

int main()
{
    char line[81], *p = line, *i;
    fgets(line, 81, stdin);

    while(*++p);                               /* Go to the end of the string */
    while(p > line)              /* Will break at the beginning of the string */
    {
        while(isspace(*--p)) ;                      /* Find the end of a word */
        while(p > line && !isspace(*(p - 1))) p--;  /* Find start of the word */
        for(i = p; *i && !isspace(*i); putchar(*i++));      /* Print the word */
        putchar(p == line ? '\0' : ' ');   /* print blank space if not at end */
    }

    return 0;
}

代码

Github最新代码,欢迎交流

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>
#include <string.h>

int main()
{
	char s[82], *p;

	scanf("%[^\n]", s);

	for (p = s + strlen(s) - 1; p >= s; p--) {
		if (*(p - 1) == ' ')
			printf("%s ", p);
		if (p == s)
			printf("%s", p);
		if (*p == ' ')
			*p = '\0';
	}

	return 0;
}