PAT(乙级)1009

1009. 说反话 (20)
给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出。

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

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

输入样例:
Hello World Here I Come
输出样例:

Come I Here World Hello

分析:这串字符串中的每个单词之间都有一个空格,可以通过空格来判断单词的分割。记录每一个空格出现的位置。

然后颠倒去输出单词即可。做法是给开头和末尾也模拟一个空格,使得每一个单词都包含的两个空格之间,使得程序可以统一去处理这些单词的输出。而不用考虑开头和结尾的特殊情形。

代码如下

#include<stdio.h>
#include<string.h>

#define size 81

void print(int a ,int b,char *p);//打印函数

int main(void)
{
  char temp[size];
  gets(temp);
  int num[size];
  int k = 1;
  num[0] = -1;//由于空格不输出,因此这里设置为-1,把初始位置当做一个空格。
  for(int i = 0; i < strlen(temp);i++)
{
    if(' ' == temp[i])
    {
      num[k++] = i;//记录空格位置
    }
  }
  num[k] = strlen(temp);//把最后的末位置也当做一个空格
//到此为止,我们num数组之中记录的都是空格的位置,而且开头和结尾也都包含着两个空格之间。
  for(int i = k; i >= 1; i--)
  {
    print(num[i-1] + 1,num[i] - 1,temp);
  }

  return 0;
}
void print(int a ,int b,char *p)
{
  for(int i = a; i <= b ; i++)
  {
    printf("%c",p[i]);
  }
  if(0 != a)//最后一个单词后面不能有空格。
  {
    printf("%c",' ');
  }
}
posted @ 2017-06-18 13:07  zy010101  阅读(95)  评论(0编辑  收藏  举报