【C语言的秘密】密探—深究C语言中多组输入的秘密!
场景引入:
你是否在刷题过程中,经常遇到以下场景呢?
场景一:
场景二:
从这些题上都能看见输入描述中提出了一条多组输入,那啥是多组输入?如何实现它呢?
多组输入:在输入数据时,有多组数据需要分别处理的情况
接下来探究如何利用循环实现它。
如果还有不会循环的小伙伴可以看我之前写的一篇文章:初阶C语言-分支与循环结构-CSDN博客
📚常用的输入函数的介绍
📖字符类
📝getchar(字符输入函数,包含头文件stdio.h即可使用)
getchar
int getchar (void)
可用cplusplus官网查找到函数原型如下:
📌函数讲解
函数名 getchar
函数的参数 void
函数的返回类型 int
1.成功读取到字符则返回字符的ASCII码值
2.读取失败则返回EOF(-1)
选择EOF右击鼠标找到转到定义选项,点击。
可发现,EOF就是#define定义的常量,它的值就是-1,EOF的意思是the end of file,文件末尾标志。
💌举例:
#include <stdio.h>int main()
{int ch;ch = getchar();return 0;
}
☑️getchar函数的作用是从标准输入流读取(获得)一个字符,可以简单的理解为接收键盘输入的一个字符。这里我是从键盘输入字符a,可以看见ch这个变量存储的就是字符a对应的ASCII码值97
💌举例:
☑️这里我输入的是2,但是getchar会默认把我输入的2当做字符,输出字符2对应的ASCII码值50赋值给ch。
🤔如果输入字符串或者多位数的整数会有啥结果?
😶只会取第一个读到的字符。
📝putchar(字符输出函数,包含头文件stdio.h即可使用)
putchar
int putchar (int character)
📌函数讲解
函数名 putchar
函数的参数 int character
函数的返回类型 int
1.成功读取到字符则返回字符的ASCII码值,并在屏幕上输出读取到的字符
2.读取失败则返回EOF(-1)
💌举例:
#include <stdio.h>int main()
{int ch;int a;ch = getchar();a = putchar(ch);return 0;
}
☑️第一个a是我输入给getchar函数,第二个a是程序执行到putchar函数,在屏幕上(终端)上打印的字符a。ch接收了getchar函数的返回值,a接受了putchar函数的返回值,这里都是字符a对应的ASCII码值97。
📝字符类的多组输入
💌举例:设置一个程序,只有当输入的字符为数字时才将其输出
#include <stdio.h>int main()
{int ch;while ((ch = getchar()) != EOF){if (ch >= '0' && ch <= '9'){putchar(ch);printf("\n");//单纯打印一个字符换个行,方便观察}}return 0;
}
☑️多组输入按control+z+回车即可退出。
💌举例:场景一
#include <stdio.h>int main()
{int ch;while ((ch = getchar()) != EOF){if (ch >= 'A' && ch <= 'Z')//大写字母putchar(ch + 32);else if (ch >= 'a' && ch <= 'z')//小写字母putchar(ch - 32);printf("\n");//换行方便观察}return 0;
}
☑️大小写字母的ASCII码值之间相差了32。
🤔思考:同样是换行方便观察,为啥输出结果是这样呢?
😶事实上你输入的是字母然后按了个回车(ASCII码值是10),回车是转义字符'\n',等于你输入了两个字符。
☑️细心的你会发现上一个例题是满足条件才printf("\n"),而这次是经过一次循环就会进行一次printf("\n")。
改进:
#include <stdio.h>int main()
{int ch;while ((ch = getchar()) != EOF){if (ch >= 'A' && ch <= 'Z')//大写字母{putchar(ch + 32);printf("\n");}else if (ch >= 'a' && ch <= 'z')//小写字母{putchar(ch - 32);printf("\n");}}return 0;
}
📖万能类
📝scanf(包含头文件stdio.h即可使用)
💌举例:
#include <stdio.h>int main()
{char password[20];printf("请输入密码:");scanf("%s", password);//数组名就是地址,可以不加&printf("请确认你的密码:(Y/N)");int ch = getchar();if (ch == 'Y')printf("确认成功\n");elseprintf("确认失败\n");return 0;
}
🤔思考:为啥都没有让我输入Y/N就确认失败了呢?
😶输入缓冲区的引入
注:因为getchar读到的是缓冲区内的字符'\n'(回车),故出现了bug。
改进:在引入一个getchar读走\n,这个操作叫做清空缓冲区。
#include <stdio.h>int main()
{char password[20];printf("请输入密码:");scanf("%s", password);//数组名就是地址,可以不加&printf("请确认你的密码:(Y/N)");getchar();//处理掉缓冲区的\nint ch = getchar();if (ch == 'Y')printf("确认成功\n");elseprintf("确认失败\n");return 0;
}
其他清理缓存区的办法:
使用gets函数代替scanf函数接收字符串的输入
#include <stdio.h>int main()
{char password[20];printf("请输入密码:");gets(password);printf("请确认你的密码:(Y/N)");int ch = getchar();if (ch == 'Y')printf("确认成功\n");elseprintf("确认失败\n");return 0;
}
gets函数还会顺带把缓冲区的\n一起带走。
🤔思考:若是读取整数的函数需要单独处理掉缓冲区的\n吗?
😶不需要,因为\n不是整数不会被读取。
📝scanf函数的多组输入
#include <stdio.h>int main()
{char arr[20];while (scanf("%s", arr) != EOF){printf("%s\n", arr);}return 0;
}
注:按三次control+z+回车即可退出多组输入。可以思考一下为啥这次不需要清空缓冲区。
可见scanf函数读取时以空格或者回车作为一次读取结束标志,当是循环时,输入空格分隔开的一串字符串会被识别为两串字符串。
若要对scanf输入字符串中就是含有空格可使用以下格式:
scanf("%[^\n]", arr);
#include <stdio.h>int main()
{char arr[20];scanf("%[^\n]", arr);{printf("%s\n", arr);}return 0;
}
#include <stdio.h>int main()
{char arr[20];while (scanf("%[^\n]", arr) != EOF){printf("%s\n", arr);}return 0;
}
比较可惜的是这样会死循环,因为这种格式带不走缓冲区的内容,他只是把\n之前的字符拷贝一份放到了arr中,所以缓冲区一直有abcd abc,所以死循环了。
改进:
#include <stdio.h>int main()
{char arr[20];while (scanf("%[^\n]", arr) != EOF){printf("%s\n", arr);int ch;while ((ch = getchar()) != EOF && ch != '\n')//清空缓冲区{;}}return 0;
}
注:按两次control + z +回车即可退出多组输入。
📚总结
本节介绍了多组输入以及相关输入函数,如何清空(输入)缓冲区的一些方法。在进行多组输入时,尤其使用能读取字符,字符串的函数时,小心未清理缓冲区而产生bug。
相关文章:

【C语言的秘密】密探—深究C语言中多组输入的秘密!
场景引入: 你是否在刷题过程中,经常遇到以下场景呢? 场景一: 场景二: 从这些题上都能看见输入描述中提出了一条多组输入,那啥是多组输入?如何实现它呢? 多组输入:在输入…...
ClickHouse 语法优化规则
ClickHouse 的 SQL 优化规则是基于RBO(Rule Based Optimization),下面是一些优化规则 1 准备测试用表 1)上传官方的数据集 将visits_v1.tar和hits_v1.tar上传到虚拟机,解压到clickhouse数据路径下 // 解压到clickhouse数据路径 sudo tar -xvf…...
3-运行第一个docker image-hello world
CentOS7.9下安装完成docker后,我们开始部署第一个docker image-hello world 1.以root用户登录CentOS7.9服务器,拉取centos7 images 命令: docker pull hello-world [root@centos79 ~]# docker pull hello-world Using default tag: latest latest: Pulling from library…...

【漏洞复现】泛微e-Weaver SQL注入
漏洞描述 泛微e-Weaver(FANWEI e-Weaver)是一款广泛应用于企业数字化转型领域的集成协同管理平台。作为中国知名的企业级软件解决方案提供商,泛微软件(广州)股份有限公司开发和推广了e-Weaver平台。 泛微e-Weaver旨在…...

「git 系列」git 如何存储代码的?
这里写自定义目录标题 git 文件存储位置git 数据模型示例分析分析前准备命令哈希值 具体示例 不同版本的提交,git 做了什么工作?snapshot vs delta-based vs backup参考资料 git 文件存储位置 想要了解如何存储,首先需要知道存储位置。 当我…...

IDEA 集成 Docker 插件一键部署 SpringBoot 应用
目录 前言IDEA 安装 Docker 插件配置 Docker 远程服务器编写 DockerFileSpringBoot 部署配置SpringBoot 项目部署结语 前言 随着容器化技术的崛起,Docker成为了现代软件开发的关键工具。在Java开发中,Spring Boot是一款备受青睐的框架,然而&…...

IDEA无法查看源码是.class,而不是.java解决方案?
问题:在idea中,ctrl鼠标左键进入源码,但是有时候会出现无法查看反编译的源码,如图! 而我们需要的是方法1: mvn dependency:resolve -Dclassifiersources 注意:需要该模块的目录下,不是该文件目…...

机器视觉系统选型-定光照强度
同一个外形结构的光源,光照强度受如下影响: 单颗灯珠的亮度灯珠排列的数量和密度漫射板/防护板的材质(透明、半透明、全漫射) 在合理范围内提升光照强度,可降低对相机曝光时长的要求 外形结构尺寸相同的两款光源&am…...

ChatGLM3-6B:新一代开源双语对话语言模型,流畅对话与低部署门槛再升级
项目设计集合(人工智能方向):助力新人快速实战掌握技能、自主完成项目设计升级,提升自身的硬实力(不仅限NLP、知识图谱、计算机视觉等领域):汇总有意义的项目设计集合,助力新人快速实…...

StoneDB顺利通过中科院软件所 2023 开源之夏 结项审核
近日,中科院软件所-开源软件供应链点亮计划-开源之夏2023的结项名单正式出炉,经过三个月的项目开发和一个多月的严格审核,共产生 418个成功结项项目!其中,StoneDB 作为本次参与开源社区,社区入选的两个项目…...

Linux本地docker一键部署traefik+内网穿透工具实现远程访问Web UI管理界面
文章目录 前言1. Docker 部署 Trfɪk2. 本地访问traefik测试3. Linux 安装cpolar4. 配置Traefik公网访问地址5. 公网远程访问Traefik6. 固定Traefik公网地址 前言 Trfɪk 是一个云原生的新型的 HTTP 反向代理、负载均衡软件,能轻易的部署微服务。它支持多种后端 (D…...

SpringCloud FeignClient声明式服务调用采坑记录(A调用服务B/C,B/C重启后必须重启A后才能成功调用配置项)
SpringCloud FeignClient声明式服务调用(A调用服务B/C,B/C重启后必须重启A后才能成功调用配置项采坑记录) 1. 报错(info级别的警告信息)2. 原因:使用了默认了cache负载均衡,或者禁用了ribbonLoa…...

安装银河麒麟linux系统docker(docker-compose)环境,注意事项(一定能解决,有环境资源)
1:安装docker环境必须使用麒麟的版本如下 2:使用docker-compse up -d启动容器遇到的文件 故障1:如果运行docker-compose up 报“Cannot create redo log files because data files are corrupt or the database was not shut down cleanly a…...

BUG:编写springboot单元测试,自动注入实体类报空指针异常
原因:修饰测试方法的Test注解导入错误 造成错误的原因是 import org.junit.Test;正确的应该是 import org.junit.jupiter.api.Test前者是Junit4,后者是Junit5 junit4的使用似乎要在测试类除了添加SpringbootTest还要添加RunWith(SpringRunner.class) 同时要注意spring-boot-s…...
深度解析 InterpretML:打开机器学习模型的黑箱
深度解析 InterpretML:打开机器学习模型的黑箱 机器学习模型的高性能往往伴随着模型的复杂性,这使得模型的决策过程变得不透明,难以理解。在这个背景下,可解释性机器学习成为了一个备受关注的领域。本文将介绍 InterpretML&#…...

数据结构初阶leetcodeOJ题(二)
目录 第一题 思路: 第二题 思路 第三题 描述 示例1 思路 总结:这种类似的题,都是用快慢指针,相差一定的距离然后输出慢指针。 第一题 给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val…...

若依框架数据源切换为pg库
一 切换数据源 在ruoyi-admin项目里引入pg数据库驱动 <dependency><groupId>org.postgresql</groupId><artifactId>postgresql</artifactId><version>42.2.18</version> </dependency>修改配置文件里的数据源为pg spring:d…...

java 访问sqlserver 和 此驱动程序不支持jre1.8错误
sqlserver数据如下; TestSQL.java; import java.sql.*;public class TestSQL {public static void main(String[] args) throws ClassNotFoundException, SQLException {String driverName "com.microsoft.sqlserver.jdbc.SQLServerDriver";…...

C/C++字符判断 2021年12月电子学会青少年软件编程(C/C++)等级考试一级真题答案解析
目录 C/C字符判断 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序编写 四、程序说明 五、运行结果 六、考点分析 C/C字符判断 2021年12月 C/C编程等级考试一级编程题 一、题目要求 1、编程实现 对于给定的字符,如果该字符是大小写字母或…...
Kotlin语言实现单击任意TextVIew切换一个新页面,并且实现颜色变换
<LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:orientation"vertical"android:layout_height"match_parent"><!-- 这里放置你的其他视图组件 -->&…...
【杂谈】-递归进化:人工智能的自我改进与监管挑战
递归进化:人工智能的自我改进与监管挑战 文章目录 递归进化:人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管?3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...

C++初阶-list的底层
目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...

边缘计算医疗风险自查APP开发方案
核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)
文章目录 1.什么是Redis?2.为什么要使用redis作为mysql的缓存?3.什么是缓存雪崩、缓存穿透、缓存击穿?3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...

LeetCode - 394. 字符串解码
题目 394. 字符串解码 - 力扣(LeetCode) 思路 使用两个栈:一个存储重复次数,一个存储字符串 遍历输入字符串: 数字处理:遇到数字时,累积计算重复次数左括号处理:保存当前状态&a…...

现代密码学 | 椭圆曲线密码学—附py代码
Elliptic Curve Cryptography 椭圆曲线密码学(ECC)是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础,例如椭圆曲线数字签…...
土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等
🔍 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术,可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势,还能有效评价重大生态工程…...

(转)什么是DockerCompose?它有什么作用?
一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用,而无需手动一个个创建和运行容器。 Compose文件是一个文本文件,通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...
力扣-35.搜索插入位置
题目描述 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...

免费PDF转图片工具
免费PDF转图片工具 一款简单易用的PDF转图片工具,可以将PDF文件快速转换为高质量PNG图片。无需安装复杂的软件,也不需要在线上传文件,保护您的隐私。 工具截图 主要特点 🚀 快速转换:本地转换,无需等待上…...