PTA --- Basic Level 1009 说反话

给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出。

输入格式:

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

输出格式:

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

输入样例:

Hello World Here I Come

输出样例:

Come I Here World Hello

 

两种解决办法:

方法一

#include<stdio.h>
char xx[80][80];
int main(){
    int i = 0;
    while( scanf("%s",xx[i]) != EOF){
        i++;
    }
    for(int j = i - 1;j >= 0;j--){
        if(j != 0)
            printf("%s ",xx[j]);
        else
            printf("%s",xx[j]);
    }

    return 0;
}

不断读取字符串,直到 文件结尾

EOF 详解

遇到这个表达式:scanf("%d%d",&a,&b)!=EOF;

如果a和b都被成功读入,那么上面表达式的结果为2;

如果只有一个读入,那么上面表达式的结果为1;

如果a&&b都没有读入,那么上面表达式的结果为0(若a没有读入,则直接放弃b的读入);

如果遇到错误或者文件结尾,那么上面表达式的结果为EOF,对应的有符号数时-1;

如果遇到Crrl+Z,那么上面表达式的结果为EOF,对应的有符号数时-1;

 

 

 

方法二

由于 scanf()  遇到空白符就会停止输入,截断,而该空白符会被留在缓冲区内,由题目 

 

 所以,只需要判断   getchar() 是否等于 '  ' ,来决定是否继续读取字符串。

#include<stdio.h>
char xx[80][80];
int main(){
    int i = 0;
    scanf("%s",xx[i]);
    i++;
    while(getchar() == ' '){
        scanf("%s",xx[i]);
        i++;
    }
    for(int j = i - 1;j >= 0;j--){
        if(j != 0)
            printf("%s ",xx[j]);
        else
            printf("%s",xx[j]);
    }

    return 0;
}

输入字符串时:

scanf 碰到缓冲区里面的空字符(空格,tab,回车,换行就会截断并添加\0)

gets 是要等回车才截断字符串并添加\0

 

比如用输入字符串:abcdefg hijk回车
用scanf的话,会得到abcdefg,而gets则是:abcdefg hijk

 

scanf  遇到空白符后会结束输入,空白符会留在缓冲区!!! 

可以用 scanf("%[^\n]" , str)   输入一行数据包括空格,直到遇到换行符 ' \n '

 

posted @ 2019-10-07 18:26  远征i  阅读(204)  评论(0编辑  收藏  举报