21-分支和循环语句_while语句(中)(初阶)

21-2 代码准备

getchar():获取字符

int ch = getchar();  //把获取的字符的ASCII码值放在ch中
int main()
{
	int ch = getchar();
	printf("%c\n", ch);  //ch存的是该字符的ASCII码值,此处以字符形式打印ASCII码值对应的字符
	putchar(ch);
}

运行结果:

第一行是输入的,二三行是输出的 

注:EOF(end of file),读取错误或文件结束时,返回EOF

int main()
{
	int ch = 0;
	while ((ch = getchar()) != EOF)
	{
		putchar(ch);
	}
	return;
}

运行结果: 

 输入一个字符,按回车即可输出该字符;如果想要结束(即EOF),就按Ctrl+z

21-2 代码示例

写这样的代码有什么用呢?下面用一组例子向你展示

代码目的:输入密码->确认密码

//假如密码是字符串
int main()
{
	char password[20] = { 0 };
	printf("请输入密码:");
	scanf("%s", password);  //数组名本身就是地址

	printf("请确认密码:");
	int ret = getchar();  //键盘输入Y或N
	if ('Y' == ret)
		printf("Yes\n");
	else
		printf("No\n");
	return 0;
}

假如我的密码是:abcdef,那么输入密码,敲一个回车:

 奇怪!为什么我还没有输入Y/N,就显示No呢?

原因是:

scanf和getchar是同一类型的函数,它们不是直接从键盘上拿数据,而是从输入缓冲区里拿

输入密码:abcedf,按下回车(\n)scanf才能读到

scanf只拿按下回车前输入的密码,即abcdef

接下来getchar登场,它看到缓冲区里面还有个\n,就没等你输入Y/N就直接拿走了\n

此时,ret存的就是\n,自然不是'Y',所以进入else输出No

修改一下代码

思路:加一个getchar先把剩下的\n读取了

int main()
{
	char password[20] = { 0 };
	printf("请输入密码:");
	scanf("%s", password);  //数组名本身就是地址

	getchar();  //读取'\n'

	printf("请确认密码:");
	int ret = getchar();  //键盘输入Y或N
	if ('Y' == ret)
		printf("Yes\n");
	else
		printf("No\n");
	return 0;
}

依旧假如我的密码是:abcdef,那么输入密码,敲一个回车:

输入‘Y’确认密码,回车:

顺利执行了!但是这样就能解决所有情况吗?

假如我的密码是:abc def呢?

再次错误:

为什么呢?

原因:

输入密码:abc def,按下回车(\n)scanf才能读到

scanf读到空格前,即只读了abc

所以密码只读了abc

第一个getchar登场,此时还剩下 def\n,getchar只拿走' '(空格)

第二个getchar登场,此时还有def\n,直接读走一个字符,自然不是'Y',所以进入else输出No

综上,清除缓冲区的时候可能要清除的不是一个字符,而是一堆字符。所以我们直接搞一个循环,把所有的干扰字符都清除掉(清理缓存区)

int main()
{
	char password[20] = { 0 };
	printf("请输入密码:");
	scanf("%s", password);  //数组名本身就是地址

	int ch = 0;
	while ((ch = getchar())!= '\n')
	{
		;
	}

	printf("请确认密码:");
	int ret = getchar();  //键盘输入Y或N
	if ('Y' == ret)
		printf("Yes\n");
	else
		printf("No\n");
	return 0;
}

成功运行!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/463970.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MATLAB的多项式相加

多项式的加减在阶次相同的情况下可直接运算,若两个相加减的多项式阶次不同,则低阶多项式必须用零填补高阶项系数,使其与高阶多项式有相同的阶次。而且通常情况下,进行加减的两个多项 式的阶次不会相同,这时可以自定义一…

JVM从1%到99%【精选】-【初步认识】

目录 1.java虚拟机 2.JVM的位置 3.代码的执行流程 4.JVM的架构模型 5.JVM的生命周期 6.JVM的整体结构 1.java虚拟机 Java虚拟机是一台执行Java字节码的虚拟计算机,它拥有独立的运行机制,其运行的Java字节码也未必由Java语言编译而成。JVM平台的各种语言可以共享Java…

数据同步操作需要注意哪些点?

前言 有时候基于业务,我们会做一些数据清洗,或者老项目数据同步新项目的相关操作。在做这些业务的时候,往往需要注意一些必要的关键点,否则会造成数据的错乱,我们知道数据一单错乱是很难处理的。 参考文章 原作者&a…

unittest--封装excel操作

封装excel操作 操作流程类和对象初始化对象操作获取表格的数据初始化一个用于操作Excel文件的对象获取表头和所有测试用例数据数据拼接 (dict)主函数调用 操作流程 1、初始化表格对象: 文件路径workbook,表单名称sheet_name 2、初始化sheet对象 &#xf…

RIPGeo参文31—36(关于对比学习):鼓励对同一数据点进行各种增强(视图),以学习更健壮的表示

RIPGeo中有: —干扰参数。在内部最大化中,我们提出了步骤,以增加损失的方向更新。我们的方法不是用简单的一步方案最大化内部部分,而是在每次迭代结束时将扰动投影到球面空间上(第2-7行),这允许模型产生更微妙但有价值的扰动[31]。 [31] A. Kurakin, I. J. Goodfellow…

ChatGPT丨“智领科研新纪元:AI大模型,您的第二大脑!“

AI大模型引领未来智慧科研暨ChatGPT在地学、GIS、气象、农业、生态、环境等领域中的应用 以ChatGPT、LLaMA、Gemini、DALLE、Midjourney、Stable Diffusion、星火大模型、文心一言、千问为代表AI大语言模型带来了新一波人工智能浪潮,可以面向科研选题、思维导图、数…

【蓝桥杯嵌入式】四、各种外设驱动(七)定时器的输出比较功能

温馨提示:本文不会重复之前提到的内容,如需查看,请参考附录 【蓝桥杯嵌入式】附录 重点提炼: 根据手册内容,输出比较模式(output Compare CHx)的功能主要需要由以下参数决定: 通…

Ubuntu Flask 运行 gunicorn+Nginx 部署

linux Ubuntu 下运行python 程序出现killed 原因:CPU或内存限制:在华为云上,你可能有CPU或内存使用的限制。例如,如果你使用的是一个固定大小的实例,那么超过该实例的CPU或内存限制可能会导致进程被杀死。 参考&am…

react中hooks使用限制

只能在最顶层使用Hook 不要在循环、条件中调用hook,确保总是在React函数最顶层使用它们 只能React函数中调用Hook 不要在普通的js函数中调用 在React的函数组件中调用Hook 在自定义hook中调用其他hook 原因: 我们每次的状态值或者依赖项存在哪里&…

matplotlib-散点图

日期:2024.03.14 内容:将matplotlib的常用方法做一个记录,方便后续查找。 # 引入需要使用的库 from matplotlib import pyplot as plt# 设置画布大小 plt.figure(figsize(20,8),dpi 300)# 全局设置中文字体 plt.rcParams[font.sans-serif]…

JAVA学习9

目录 一.继承 1.继承的原理: 2.继承的细节: 3.继承的本质: 二.super的使用: 1.基本介绍: 2.注意事项与使用细节:(1)访问父类的属性super.属性名,但不能访问父类的p…

洛谷P1941题解

题目背景 NOIP2014 提高组 D1T3 题目描述 Flappy Bird 是一款风靡一时的休闲手机游戏。玩家需要不断控制点击手机屏幕的频率来调节小鸟的飞行高度,让小鸟顺利通过画面右方的管道缝隙。如果小鸟一不小心撞到了水管或者掉在地上的话,便宣告失败。 为了…

蓝桥杯2023年省A(一波三折的)【买瓜】折半搜索+剪枝+排序

题目:洛谷 P9234 [蓝桥杯 2023 省 A] 买瓜 折半搜索 一开始觉得像dp,试着写了,显然过不了,但我实在觉得搜索也过不了啊,去看题解,发现使用了折半搜索(每天都觉得啥都不会捏 折半搜索就是先搜一…

CentOS部署 JavaWeb 实现 MySql业务

一、项目打war包 在eclispe或idea中找到项目,右键打war包。 二、上传项目到linux 2.1云服务器虚拟机均可 以tomcat为例 /usr/local/tomcat/webapps 将war包通过ssh连接上传到webapps目录下。 如果是root目录则不需要项目名即 ip或域名端口直接访问&#xff08…

数学建模-估计出租车的总数

文章目录 1、随机抽取的号码在总体的排序 1、随机抽取的号码在总体的排序 10个号码从小到大重新排列 [ x 0 , x ] [x_0, x] [x0​,x] 区间内全部整数值 ~ 总体 x 1 , x 2 , … , x 10 总体的一个样本 x_1, x_2, … , x_{10} ~ 总体的一个样本 x1​,x2​,…,x10​ 总体的一个样…

Linux磁盘配额

磁盘配额 概述 Linux系统作为一个多用户的操作系统,在生产环境中,会发生多个用户共同使用一个磁盘的情况,会造成Linux根分区的磁盘空间耗尽,导致Linux系统无法建立新的文件,从而出现服务程序崩溃、系统无法启动等故障…

Elasticsearch:调整搜索速度

在我之前的文章 “Elasticsearch:如何提高查询性能” 及 “Elasticsearch:提升 Elasticsearch 性能” 里,我详细描述了如何提高搜索的性能。在今天的文章里,我从另外一个视角来描述如何调整搜索的速度。希望对大家有所帮助&#x…

c++简单实现avl树

文章目录 AVL树节点类节点类的构造函数 AVLinsert()插入RotateL(左单旋)RotateR(右单旋)RotateLR(右双旋)RotateRL(左双旋) Find(查找)IsBalance(检查是否是avl树) AVL树 AVL树:又名高度平衡树,在二叉搜索树的基础上加上了一个条件,条件是左右子树高度差…

【并查集】模版

【模板】并查集 - 洛谷 #include <bits/stdc.h> using namespace std; const int N2e59; int a[N]; int Find(int x) {if(xa[x]){return x;}else{a[x]Find(a[x]);return a[x];} } void push(int x,int y) {a[Find(x)]Find(y);return ; } int main() {int n,m; cin>>…

(十七)【Jmeter】取样器(Sampler)之JSR223取样器

该实例使用python 2.7.3的插件,jython-standalone-2.7.3.jar:https://www.123pan.com/s/VppKjv-5YvTv.html 提取码:tfsX 把该插件放在Jmeter安装的:apache-jmeter-5.6.3\lib\ext目录下: 简述 JSR是Java Specification Requests的缩写,意思是Java规范提案 操作路径如下: …