一、题目详情
问题描述:说反话
给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出。
输入格式:
测试输入包含一个测试用例,在一行内给出总长度不超过 80 的字符串。字符串由若干单词和若干空格组成,其中单词是由英文字母(大小写有区分)组成的字符串,单词之间用 1 个空格分开,输入保证句子末尾没有多余的空格。
输出格式:
每个测试用例的输出占一行,输出倒序后的句子。
输入样例:
Hello World Here I Come
输出样例:
Come I Here World Hello
代码长度限制:16 KB
时间限制:400 ms
内存限制:64 MB
二、题目解析
代码:
#include <stdio.h>
#include <string.h>
int main()
{
/*
* str[81]:存储通过键盘输入的字符串
* len:存储通过键盘输入的字符串的长度
* ss[81]:临时存储提取出来的每一个单词
* pos1,pos2:分别存储每一个单词的首位字母在字符串中的位置
* word:数组下标i所指向的字符是否属于某单词的一部分,1为是,0为否
* fisrt:标识是否为提取出的第一个单词,1为是,0为否
* i,j,k:循环变量
*/
int i, j, k;
int len, pos1, pos2, word=0, first=1;
char str[81], ss[81];
//通过键盘读取字符串
gets(str);
len = strlen(str);//获取字符串的长度
//从尾部向首部逐一判别字符,以从中提取单词并输出
for(i=len;i>=0;i--)
{
//忽略多余的空格
if(str[i]==' ' && word==0)
continue;
//处于单词的尾部首字母位置上
if(str[i]!=' ' && word==0)
{
word = 1;//标记遇到了单词
pos2 = i;//标记单词末位字符的位置
if(i==0)//已至字符串的首位
{
pos1 = i;//标记单词首位字符的位置
//从首位至末位,复制单词的全部字符至字符数组ss中
for(j=pos1,k=0;j<=pos2;j++,k++)
ss[k] = str[j];
ss[k] = '\0';//补充字符串终止符
if(first)//如果是第一个单词
{
printf("%s", ss);//不带空格输出单词
first = 0;//表明已识别出第一个单词
}
else
printf(" %s", ss);//带空格输出单词
break;//结束识别
}
continue;//继续识别
}
//处于单词的某个字母位置上(除尾部的首字母)
if(str[i]!=' ' && word==1)
{
if(i==0)//已至字符串的首位
{
pos1 = i;//标记单词首位字符的位置
//从首位至末位,复制单词的全部字符至字符数组ss中
for(j=pos1,k=0;j<=pos2;j++,k++)
ss[k] = str[j];
ss[k] = '\0';//补充字符串终止符
if(first)//如果是第一个单词
{
printf("%s", ss);//不带空格输出单词
first = 0;//表明已识别出第一个单词
}
else
printf(" %s", ss);//带空格输出单词
break;//结束识别
}
continue;//继续识别
}
//处于单词首字母前的空格字符位置上
if(str[i]==' ' && word==1)
{
word = 0;//标记某个单词已识别完成
pos1 = i+1;//标记单词首位字符的位置
//从首位至末位,复制单词的全部字符至字符数组ss中
for(j=pos1,k=0;j<=pos2;j++,k++)
ss[k] = str[j];
ss[k] = '\0';//补充字符串终止符
if(first)//如果是第一个单词
{
printf("%s", ss);//不带空格输出单词
first = 0;//表明已识别出第一个单词
}
else
printf(" %s", ss);//带空格输出单词
continue;//继续识别
}
}
return 0;
}
提交结果(分数/满分):
20/20
提示:
若输入样例1为:
I(空格)(空格)(空格)love(空格)(空格)(空格)China
则输出样例1为:
China(空格)love(空格)I
可忽略内部多余的空格,符合题设。
若输入样例2为:
(空格)(空格)(空格)I(空格)(空格)(空格)love(空格)(空格)(空格)China(空格)(空格)(空格)
则输出样例2为:
(空格)China(空格)love(空格)I
可以看出, 单词China前面多输出了一个空格,请读者分析原因,可否删除,并尝试在留言区给出解决思路。