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

news2024/11/16 20:33:35

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;
}

成功运行!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++容器适配器与stack,queue,priority_queue(优先级队列)的实现以及仿函数(函数对象)与deque的简单介绍

🎉个人名片: 🐼作者简介:一名乐于分享在学习道路上收获的大二在校生 🙈个人主页🎉:GOTXX 🐼个人WeChat:ILXOXVJE 🐼本文由GOTXX原创,首发CSDN&…

简单的溯源取证

环境准备: Linux虚拟机:内网部署蜜罐探测系统 。(192.168.XX.XX) windows虚拟机:有FTP弱口令漏洞的web服务 (受害机器) (192.168.125.134) kali Linux虚拟机:攻击机服务端 。 (192.168.125.130) MAC:管理员电脑。(192.168.XX.XX) 一、利用kailiLinuxmsf生成windows木马文件…

Maven项目 快速修复log4j 漏洞

1、log4j 漏洞介绍 log4j的漏洞介绍以及原理请参考文章 ,网址详见下面文章 Log4j漏洞原理及修复_linux log4j漏洞修复方案-CSDN博客,遇到这个漏洞要升级log4j 的jar包到2.17.0 以上。 2、项目快速处理方案 由于maven 管理jar 的spring 项目或者…

dpdk二层转发环境搭建-二

文章目录 前言虚拟机的网络拓扑结构网络拓扑结构网络配置 DPDK的准备工作DPDK的编译网卡绑定 测试 前言 我之前尝试通过namespace,搭建dpdk的测试环境,但是对于tcp有点问题,而且过程也比较麻烦,见: dpdk网络转发环境的…

es文档操作命令

文档操作 documents 创建数据(put) 向 user 索引下创建3条数据 PUT /user/_doc/1 {"name":"zhangsan","age":18,"sex":"男","info":"一顿操作猛如虎,一看工资2500"…

【OpenCV • c++】图像平滑处理(1) —— 线性滤波

文章目录 一、平滑处理二、图像滤波三、邻域算子与线性邻域滤波四、方框滤波代码演示 一、平滑处理 平滑处理也称为模糊处理,是一种简单且使用频率很高的图像处理方法,平滑处理的用途有很多,最常见的是用来减少图像上的噪点或者失真。在涉及到…

鸿蒙Harmony应用开发—ArkTS声明式开发(容器组件:EffectComponent)

特效合并容器组件,用于子节点特效绘制的合并,实现特效的绘制性能优化。 说明: 该组件从API Version 10开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 该组件为系统接口。 目前该组件仅支持子组件背景…

[java基础揉碎]Object类详解

目录 equals方法: hashCode: toString: finalize: equals方法: 和equals对比 1.: 既可以判断基本类型,又可以判断引用类型 2.: 如果判断基本类型,判断的是值是否相等。示例: int i10; double d10.0; 3.:如果判断引用类型,判断的是地址是…

信息检索(十三):On Complementarity Objectives for Hybrid Retrieval

On Complementarity Objectives for Hybrid Retrieval 摘要1. 引言2. 相关工作2.1 稀疏和密集检索2.2 互补性 3. 提出方法3.1 Ratio of Complementarity (RoC)3.2 词汇表示(S)3.3 语义表示(D)3.4 互补目标 4. 实验4.1 实验设置4.2…

哪里有视频素材网站免费下载?高清烟花视频素材哪里有?

如果你在寻找那些能点亮夜空的绚丽烟花视频素材,或者无水印的高清视频素材,那下面这些资源网站将会是你的宝库。今天,我要分享给你一些最佳的无水印视频素材下载网站,让你的视频制作闪耀起来。 1.蛙学府 这个网站是视频创作者的天…

windows使用docker运行TP6使用swoole内置http服务

1,下载docker-Windows客户端 下载地址:https://www.docker.com/products/docker-desktop docker --version #查看docker版本 docker-compose --version #查看docker-compose版本 2,安装环境 使用一键安装包:https://gitee.com/yes…

如何在Linux CentOS部署宝塔面板并实现固定公网地址访问内网宝塔

文章目录 一、使用官网一键安装命令安装宝塔二、简单配置宝塔,内网穿透三、使用固定公网地址访问宝塔 宝塔面板作为建站运维工具,适合新手,简单好用。当我们在家里/公司搭建了宝塔,没有公网IP,但是想要在外也可以访问内…

Android和IOS应用开发-Flutter 应用中实现记录和使用全局状态的几种方法

文章目录 在Flutter中记录和使用全局状态使用 Provider步骤1步骤2步骤3 使用 BLoC步骤1步骤2步骤3 使用 GetX:步骤1步骤2步骤3 在Flutter中记录和使用全局状态 在 Flutter 应用中,您可以使用以下几种方法来实现记录和使用全局状态,并在整个应…

深度学习pytorch——基本数据类型创建Tensor(持续更新)

声明:本深度学习笔记基于课时18 索引与切片-1_哔哩哔哩_bilibili学习而来 All is about Tensor 定义:Tensors are simply mathematical objects that can be used to describe physical properties, just like scalars and vectors. In fact tensors a…

粤嵌6818开发板通过MobaXterm使用SSH连接开发板

链接:https://pan.baidu.com/s/18ISP4Ub1HtQx6jCvTQTUHw?pwdfjmu 提取码:fjmu 1.把SSH_config.tar.bz 下载到开发板中 2.解压 SSH_config.tar.bz 解压命令:tar -xzvf SSH_config.tar.bz 3.配置SSH 进入SSH/openssh目录&am…

【深度长文】聊一聊 Java AbstractQueuedSynchronizer 以及在 ReentrantLock 中的应用

文章目录 AQS 原理简述内部数据结构公平锁 vs. 非公平锁ReentrantLock 非公平锁ReentrantLock 公平锁 AQS 源码分析加锁过程addWaiteracquireQueuedshouldParkAfterFailedAcquirecancelAcquire 解锁过程unparkSuccessor AbstractQueuedSynchronizer (AQS) 是 Java 并发包中&…

【Qt问题】解决已经下载好的qt怎么添加或卸载其他组件

问题描述: 使用一段时间Qt以后发现需要用到某个组件,比如Qt Webengine这个组件等,而此时我又不可能把Qt卸载了,重新安装一次。 解决办法: 其实Qt提供了安装或卸载其他组件的方式,以下是操作步骤&#xff…

nuxt3项目总结

nuxt3项目总结 仓库 前言 大半年的时间,项目从秋天到春天,从管理后台到APP再到数据大屏,技术栈从vue3到uniApp再到nuxt3,需求不停的改,注释掉代码都快到项目总体的三分之一。 一、准备-搭建项目架子 1.1 创建一个…

windows无法启动HV主机服务 服务(位于本地计算机上) 错误 1068:依赖服务或组无法启动

背景: LZ本地装了VMware Workstation虚拟机,里面装了Oracle, 又在Docker里装了PostgreSQL, 操作系统是Windows10 专业版 如果启动VM,就报这个错Device/Credential Guard 不兼容 参考这个博客,就可以解决 与Device/Credetial Guard不兼容 我用到的是方法二, 但是想用Docker时, …

吴恩达机器学习笔记 二十四 决策树模型 学习过程 什么时候停止分裂 如何选择结点特征

案例:识别小猫,上面这个分类的特征 x 采用分类值(几个离散的值) 决策树最顶端的结点称根结点(root node),除了根结点和叶子结点之外的叫决策结点(decision node),最底层的叫叶子结点(leaf node)&#xff0c…