题目介绍
给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出。
输入格式:测试输入包含一个测试用例,在一行内给出总长度不超过80的字符串。字符串由若干单词和若干空格组成,其中单词是由英文字母(大小写有区分)组成的字符串,单词之间用1个空格分开,输入保证句子末尾没有多余的空格。
输出格式:每个测试用例的输出占一行,输出倒序后的句子。
输入样例:
Hello World Here I Come
输出样例:
Come I Here World Hello
源代码
#include<stdio.h>
#include<string.h>
int main()
{
//读入数据
char szData[100];
fgets(szData,99,stdin);
//定义数组长度及单词首尾变量
int iLength=strlen(szData)-1;
int iBegin=0,iEnd=iLength-1;
//倒序遍历
for(int i=iLength-1;i>-1;i--)
{
if(szData[i]==' ')
{
//单词开始为空格后一位
iBegin=i+1;
//循环输出该单词
for(int j=iBegin;j<=iEnd;j++)
{
printf("%c",szData[j]);
}
printf(" ");
//单词末尾为空格前一位
iEnd=i-1;
}
}
//输出第一个单词
iBegin=0;
for(int j=iBegin;j<=iEnd;j++)
{
printf("%c",szData[j]);
}
return 0;
}
错误分析
思路
拿到此题后的思路是想着用栈的结构体来实现,可是到后来都没有实现成功。因此转移思想为从最后一个字符开始往前读取,如果为空格,则将空格后面所有的字符进行输出。然后更新指向的标记,直到读到第一个元素为止。
新的知识
fgets(szData,99,stdin);
fgets函数的头文件是<\stdio.h>,原型如下:
char *fgets(char *s, int size, FILE*stream);
fgets从stream中读取最多size-1大小的内容到s指定的buffer中,当遇到换行符或EOF时读取结束。读取成功时,返回s地址;失败时返回null。需要注意的是,fgets会在所读取的内容后面添加’\0’,这样,fgets读取的内容中会包括行末尾的’\n’字符。如果要获取读取字符串的长度,可以调用strlen函数获得。