给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出。
输入格式:
测试输入包含一个测试用例,在一行内给出总长度不超过 80 的字符串。字符串由若干单词和若干空格组成,其中单词是由英文字母(大小写有区分)组成的字符串,单词之间用 1 个空格分开,输入保证句子末尾没有多余的空格。
输出格式:
每个测试用例的输出占一行,输出倒序后的句子。
输入样例:
Hello World Here I Come
输出样例:
Come I Here World Hello
注意:
- scanf函数、cin 与 gets函数不同,当字符串中间有空格时,必须采用gets函数,若使用scanf和cin,读取字符串时,会在空格处结束
- 本题采用gets函数读入一整行,从左到右以空格为分隔符,对单词进行划分,按顺序存储于二位字符数组中,最后按逆序来输出所有单词。
- 同时注意最后一个单词后没有空格。
- 如下代码(含有gets函数)只有在 C(clang) 编译环境下才会完全通过
#include <stdio.h>
#include <string.h>
int main()
{
char str[90];
//scanf("%s", &str);
//cin >> str;
gets(str);
int len = strlen(str),r = 0,h = 0;
char ans[90][90];
for(int i = 0; i < len; i++)
{
if(str[i] != ' ') //按空格划分,存入二维数组
ans[r][h++] = str[i];
else{
ans[r][h] = '\0';
r++;
h = 0;
}
}
for(int i = r; i >= 0; i--){
printf("%s", ans[i]);
if(i > 0)
printf(" ");
}
return 0;
}
本题还有一个简单解法,首先应该清楚scanf函数的返回值问题:
scanf函数是有返回值的,它的返回值分为三种情况:
- 正整数:表示正确输入参数的个数,例如执行scanf(“%d %d”, &a, &b); 若输入“3 4”,返回2;若输入“3,4”,返回1
- 0 : 表示用户输入不匹配,无正确输入任何值,若输入“,3,4”,返回0
- EOF : 这是在 stdio.h 中定义的常量(通常值为-1),表示输入流已经结束。在win下,用户按CTRL + Z会看到一个^Z字符,再按下回车,就表示输入结束;Linux/Unix下使用CTRL+D表示输入结束。ACM 中, 测试用例都是存在文件里面的。在自动测试时, 会以文件作为输出, 实际输入的是文件的内容,到输入结束, 会自动得到一个文件结尾标记,即scanf返回结果为EOF。
鉴于此,我们采用更加简洁的方法,使用EOF来判断单词是否已经输入完毕,代码如下:
scanf函数读到空格时,会停下来,num++,从而继续下一次while循环
#include <cstdio>
int main(){
int num = 0; //记录单词个数
char ans[90][90]; //存储单个单词
while(scanf("%s", ans[num]) != EOF)
num++;
for(int i = num - 1; i >= 0; i--){
printf("%s", ans[i]);
if(i > 0)
printf(" ");
}
return 0;
}