IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> PAT乙级1009,用C语言进行编程,给定一句英语实现倒序打印 -> 正文阅读

[C++知识库]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,还有的话就是倒序打印的方法要清楚。

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-07-16 11:05:17  更:2021-07-16 11:05:51 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/5 16:05:41-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码