给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出。
输入格式:
测试输入包含一个测试用例,在一行内给出总长度不超过 80 的字符串。字符串由若干单词和若干空格组成,其中单词是由英文字母(大小写有区分)组成的字符串,单词之间用 1 个空格分开,输入保证句子末尾没有多余的空格。
输出格式:
每个测试用例的输出占一行,输出倒序后的句子。
输入样例:
Hello World Here I Come
输出样例:
Come I Here World Hello
源代码
#include <stdio.h>
// 算法思想:由于输入时各个单词之间是由空格分开的,所以只需要从后往
// 前遍历字符数组,遇到空格即表示找到一个单词的开始,然后从此处向后
// 输出即可,输出结束索引就是函数传递的第二个参数
// 由于是从后往前遍历的,所以每一个单词输出后便以当前单词开始的前两个位置作为
// 新的结束点输出前一个单词
void printPiece(char ch[], int endIndex)
{
if (endIndex >= 0)
{
int i;
// 从当前位置开始寻找前面最近的空格.空格后一个位置就是当前单词的开始位置
// 对于第一个单词而言,因为前面没有空格,所以只能用i==-1来判断
for (i = endIndex; ch[i] != ' ' && i >= 0;)
{
i--;
}
// 跳出上一个循环的条件是当前遇到了空格或者当前字符的索引为-1,则当前位置
// 的下一个位置就是单词的开始位置,结束为止就是endIndex指定的位置
for (int j = i + 1; j <= endIndex; j++)
{
printf("%c", ch[j]);
}
// i不等于-1说明当前单词不是第一个单词,所以需要用空格和其他单词分开,而i==-1时
// 不需要空格
if (i != -1)
{
printf(" ");
}
else
{
printf("\n");
}
// 继续向前找到前一个单词输出
printPiece(ch, i - 1);
}
}
int main()
{
// 用于保存输入的字符串
char input[81];
char ch;
int i;
// 一次从控制台获取一个字符
for (i = 0; i < 80 && (ch = getchar()) != '\n'; i++)
{
input[i] = ch;
}
//输入完毕后在字符串末尾添加一个空字符,表示输入结束
input[i + 1] = '\0';
printPiece(input, i);
return 0;
}
不足之处
pat上面有几组测试数据答案错误,由于没有具体的数据所以还没找到问题出在哪,后面如果发现在再回来改