PAT乙级1009,用C语言进行编程,给定一句英语实现倒序打印

正如标题所说,今天带来的是PAT中一道20分的题目,也就是PAT乙级1009说反话。

其实题目要求很简单,就是给定一句英语,用字符串的形式存储,然后用C语言把句中所有单词和空格进行一个倒序打印出来即可。

那么,在得到这个题目的要求后,我们就可以分析出该题目的逻辑:

1、要用到字符串,但是这里得注意,C语言中并没有字符串这个类型,它不像C++和Java一样是有字符串类型的,所以要表现出字符串,就得需要使用字符数组,或者说是字符指针,不过今天这道题呢,当然是以字符数组为主,看起来也能更加直观一些。

2、字符串中有空格,我们都知道,一般在写scanf的时候,空格会默认是下一条语句或者下一次输入,所以这个时候就需要用到一个格式字符%[ ],它的作用是扫描字符集合,并对结束符进行一个自定义,我这里打算用到的是^\n,也就是换行回车,只有到按回车的时候,此次输入才会结束,所以空格符号也算在字符数组当中的,它相当于一个字符串。

3、最后一个关键就是倒序打印,因为我们是用字符数组来存储该语句的,所以是用数组的形式,当然这里与我们之前所做的题也不同,这里的数组长度需要用到一个strlen()函数来求的,而且该函数是存在于C语言的#include<string.h>库里的,进行调用即可。

其次就是数组要倒着遍历,那这也简单,就是反向遍历,从数组的最后一位开始,不停地i--,倒着打印的时候一般都是一个字符串加一个空格,直到最后一位时,是只打印出一个单词。

所以在进行内循环的时候,需要做一个条件判断,就是当遇到空格的时候,我们可以选择直接打印出空格,然后到最后的一个元素的时候,就直接把字符串改为\0,注意,这里又用到了\0,\0是转义字符,通常是用来表达字符串的结束标志的。

理清逻辑后,画出流程图

总的来说,从这张流程图中可以看出来,最关键最复杂的地方就是对是否遇到空格的判断。

代码实现

1、关于第一个输入字符串,我是用到一个scanf,然后用到一个格式字符%[ ],表现形式应该为:scanf("%[^\n]", string);

2、for循环的时候,要倒着遍历,所以需要知道数组的长度,也就是用到strlen函数。

strlen函数,主要作用是用来计算给定字符串的长度,计算字符串长度的方法是从开始到遇到第一个\0。

3、因为倒着遍历的时候会有空格,所以需要对空格进行一个判断,空格也算一个字符串,主要原因是在于我们在倒着遍历数组的时候,由于下标是不超过80,后面的元素都为空,所以要跳过空的元素,最后输出结果。

//strlen用于计算给定字符串的长度
#include<stdio.h>
#include<string.h>
int main() {
    char string[80];
    long i = 0;
    scanf("%[^\n]",string);
    for(i = strlen(string); i > 0;i--){
        if (string[i] == ' ') {//遇到空格,也就是空出来的
            printf("%s ", &string[i+1]);
            string[i] = '\0';
        }
    }
    printf("%s\n", &string[i]);
}

 当然,其实这里不用到strlen也是可以的,毕竟要求是总长度不超过80,那么i从第80位开始遍历也完全没有问题。

#include<stdio.h>
int main() {
    char string[80];
    long i = 0;
    scanf("%[^\n]",string);
    for(i = 80; i > 0;i--){
        if (string[i] == ' ') {//遇到空格,也就是空出来的
            printf("%s ", &string[i+1]);
            string[i] = '\0';
        }
    }
    printf("%s\n", &string[i]);
}

 测试结果:

测试一:

 

测试二:

 

以上两个都经过测试,结果是正确的,接下来就是提交到PAT网站上再进行测试。

PAT提交结果

遇到的问题

我在Xcode里写代码的时候遇到过编译器产生警告:

这里的警告语句为:Implicit conversion loses integer precision: 'unsigned long' to 'int'。

这里就涉及到unsigned long 和 int的区别

unsigned long指的是无符号长整型,而int则是整数型,我们应该知道,一个数组的长度应该是整数型或者说是长整型的,再怎么样也不会到无符号长整型,可是我的Xcode却因为这个报了警告。

意思是隐式转换缺失整数精度,建议用unsigned long来代替int,但实际上只是缺失精度的话,完全可以用long 来代替int ,我尝试了一下,这样带进去的话也不会再有警告了。

总结

总的来说,这道题其实主要是对C语言一些函数的了解,当然不了解也没关系,毕竟可以直接给定数组的长度80,还有的话就是倒序打印的方法要清楚。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值