PAT 乙级 1009说反话

题目描述:

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

输入格式:

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

输出格式:

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

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

C语言实现代码如下:

#include<stdio.h>
#include<string.h>
int main(){
    char str[81][81];
    int i = 0;
    for(i=0;i<10;i++){
        scanf("%s", &str[i]);
        if(getchar()=='\n') break;
    }
    // 此时i的值就是最后一个单词的下标
    int p = 0;
    int q = i;
    while(p<q){
        char tmp[81];
        strcpy(tmp, str[p]);
        strcpy(str[p], str[q]);
        strcpy(str[q], tmp);
        p++;
        q--;
    }
    for(int j=0;j<=i;j++){
        printf("%s", str[j]);
        if(j!=i) printf(" ");
    }
}

受到昨天1008的影响,这里我的思路是把每个单词取出来放进数组,然后以中点为轴交换位置。交换不难,主要是在读输入的时候遇到问题。由于没有变长数组,所以只能定义81*81的字符数组。scanf函数循环读取字符串的时候,遇到空格或回车就视为读完此串。但是如果循环没有结束,依然会等待输入。也就是说,如果没有这一句

if(getchar()=='\n') break;

那么即使输入只有五个单词,在输入完按下回车后,仍然没有停止读入(也许要按到80个回车)。
然后贴一个网上看到的更好的解法(Hunter1023)

int main() {
    char str[81]; //创建字符串
    gets(str); //读取字符串
    int i = 0; //数组下标 
    for (i = strlen(str); i > 0; i--) { //从末尾开始遍历字符串 
        if (str[i] == ' ') { //如果遇到空格 
            printf("%s ", &str[i+1]); //输出空格后的单词 
            str[i] = '\0'; //把空格改为 \0,使后续输出也只有一个单词
        }   
    } 
    printf("%s", &str[i]); //输出原字符串的第一个单词 
    return 0; 
}

确实巧妙,直接从末尾往前读。并且手工添加’\0’,读出每一个单词。并且printf这样用我是没想到的:

printf("%s ", &str[i+1]); //输出空格后的单词 

无论是空间还是时间都更优。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值