关于getchar的用法及实例解析

news2024/11/24 20:39:43

一、getchar()函数是什么?

 getchar()函数是获取一个字符。说到这里就有人问了,为什么他的返回类型是int?

因为实际上EOF=end of file(-1),EOF实际上就等于-1。当你返回失败的时候返回的是-1,所以说要用int,用char肯定不行。而且在底层逻辑上,所有的字符在ASC||值上都对应着一个整型数值。

二、由代码初步了解getchar()函数

#define _CRT_SECURE_NO_WARNINGS 1 
#include <stdio.h>
int main()
{
	int ch = 0;
	while ((ch = getchar()) != EOF)
	{
		printf("%c\n", ch);
		putchar(ch);//这里的putchar()就是在控制面板上打印一个字符!
	}
	return 0;
}

代码运行如下图:

 当我在键盘上输入一个q的时候,printf()打印一个q,putchar()打印一个q。

最后要我想程序结束的话,按上一个CTRL加z,再按下回车即可。

三、实例(“输入密码”例题)进一步了解

1、代码达不到理想效果

我们再来看看下面这段代码

#include <stdio.h>
int main()
{
	char passward[20] = { 0 };
	printf("请输入密码:>");
	scanf("%s",passward);//123456
	char input = 0;
	printf("请确认密码:>(Y/N)");
	input = getchar();
	if (input == 'Y')
	{
		printf("确认成功!\n");
	}
	else
	{
		printf("确认失败!\n");
	}

	return 0;
}

 密码是当然可以正常输入,但是在确认密码的那一步太着急了,我们没有确认,他就直接:“确认失败”了!?

 2.引入 输入缓冲区 的概念

这里的问题是为什么呢?接下来就有必要跟大家引出这个:输入缓冲区 的概念。

 

         我们都知道scanf()和getchar()都是需要你在键盘上输入的函数,但是我们键盘上打印什么,他就直接输入到里面了吗?实际上在键盘和scanf与getchar这类函数之间,有一个输入缓冲区域的东西。

        当你在输入123456之后,又在键盘上按了一个回车,也就是\n。然后scanf只取走123456存放到password中。此时在输入缓冲区中还存在一个字符,\n。当下一步你要确认密码是否输入正确的时候,那么getchar()就来到输入缓冲区里面来,看看里面还有什么东西,当你没输入的时候,它里面已经存在了一个\n,所以说直接确定失败,因为那不是Y。        

        那么问题来了,如何避免这种情况的发生呢?我们可以在确定之前添加一个getchar(),把这个斜杠n直接吃掉。


#include <stdio.h>
int main()
{
	char passward[20] = { 0 };
	printf("请输入密码:>");
	scanf("%s",passward);//123456


	getchar();//负责吃掉你,当时按下的回车键也是字符:\n。

	char input = 0;
	printf("请确认密码:>(Y/N)\n");
	input = getchar();
	if (input == 'Y')
	{
		printf("确认成功!\n");
	}
	else
	{
		printf("确认失败!\n");
	}

	return 0;
}

 那么此时此刻代码就可以正常的运行了。

但是还有一件事,我们需要对这个密码进行升级,那么这种方法又不可行。

比如说我现在设置的密码为:123456 abc(中间有个空格)

运行一下:

 此时还是出现了我们刚才出现的问题。这次password只存放了123456,也就是空格之前的所有东西。

那么这个问题如何解决呢?当然聪明的你也想到了,用一个循环的getchar()来实现

所以我们需要把缓冲区中的东西先全部清走
那我们就用一个循环,只要没读到\n,我们就一直用getchar读

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

此循环就是用来清空输入缓冲区,从而避免你在确认密码时输入Y或N会出现差错的问题。

整段代码如下图


#include <stdio.h>
int main()
{
	char passward[20] = { 0 };
	printf("请输入密码:>");
	scanf("%s",passward);//123456 abc


	//getchar();//负责吃掉你,当时按下的回车键也是字符:\n。

	while (getchar() != '\n')
	{
		;
	}//此循环用来清空输入缓冲区,直到遇到\n结束为止。
	//只有清空输入缓冲区的时候,你才能进行下一步的确认密码时,输入缓冲区空空如也,不会出现差错。

	char input = 0;
	printf("请确认密码:>(Y/N)\n");
	input = getchar();
	if (input == 'Y')
	{
		printf("确认成功!\n");
	}
	else
	{
		printf("确认失败!\n");
	}

	return 0;
}

运行一下子:

 加了while循环后,getchar便可获取缓冲区中多余的字符,避免他们干扰后面的getchar的判断。

        这里有一个巧妙的地方,由于循环的判断次数总比循环次数多一次,使得getchar在最后也能将'\n'获取除掉。

        getchar()读取的原理是:先读取(拿走),再判断!!!针对于这个while循环。所以说最终必定会将斜杠n拿走,因为是:先读取(拿走),再判断!!!

总结
getchar与scanf不是直接从键盘上获取数据,而是通过输入缓冲区来获取。

请添加图片描述

 

 以上就是关于getchar的用法的实例解析。如果对你有帮助,记得点赞👍+关注哦!
我的主页还有其他文章,欢迎学习指点。关注我,让我们一起学习,一起成长吧!

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

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

相关文章

计算机网络(四上)——网络层!!!重中之重

先来个整章的大框架&#xff0c;看起来也没有多少东西&#xff08;bushi&#xff09;。 这篇文章&#xff0c;就先写 一、网络层的功能 互联网在网络层的设计思路是&#xff0c;向上只提供简单灵活的、无连接的、尽最大努力交付的数据报服务 1.1.异构网络互联 1.网络互联是…

Springboot +Flowable,流程表单应用之动态表单

一.简介 整体上来说&#xff0c;我们可以将Flowable 的表单分为三种不同的类型&#xff1a; 动态表单 这种表单定义方式我们可以配置表单中每一个字段的可读性、可写性、是否必填等信息&#xff0c;不过不能定义完整的表单页面。外置表单 外置表单我们只需要定义一下表单的 k…

kafka 从入门到精通

kafka 从入门到精通 安装 zookeeper模式 创建软件目录 mkdir /opt/soft cd /opt/soft下载 wget https://downloads.apache.org/kafka/3.4.0/kafka_2.13-3.4.0.tgz解压 tar -zxvf kafka_2.13-3.4.0.tgz 修改目录名称 mv kafka_2.13-3.4.0 kafka配置环境变量 vim /etc/pr…

C51基础之单片机编程中通用指针和定向指针

通用指针和定向指针 参考资料&#xff1a;Keil > Help > uVision Help > Cx51 Compiler User’s Guide > Language Extensions > Pointers 一、Cx51指针的几种用法 int *ptr; /* 指向&#xff1a;任意空间的int变量&#xff0c; 存储在&…

什么是Java中的finalize()方法?它有什么作用

在Java中&#xff0c;finalize()方法是一个由Object类定义的方法&#xff0c;用于在对象被垃圾回收器回收之前执行一些清理工作。finalize()方法是一个被保护的方法&#xff0c;可以被子类重写&#xff0c;但是通常情况下不需要显式地调用该方法。 finalize()方法的作用 在Jav…

MYSQL原理、设计与应用

概述 数据库(Database&#xff0c;DB)是按照数据结构来组织、存储和管理数据的仓库&#xff0c;其本身可被看作电子化的文件柜&#xff0c;用户可以对文件中的数据进行增删改查等操作。 数据库系统是指在计算机系统中引入数据库后的系统&#xff0c;除了数据库&#xff0c;还…

首次开通社交账号亲自招聘人才 周星驰都在关注的Web3 你知道是什么吗?

60岁的“星爷”周星驰要进军元宇宙了&#xff1f; 谁能想到&#xff0c;向来低调的他首次注册社交账号&#xff0c;竟是为了发布一条招人信息&#xff0c;挑选的还不是新片男女主角&#xff0c;而是Web3人才&#xff0c;一脚跨界到了互联网科技领域。 今天一整天&#xff0c;…

2022-2023 年度广东省职业院校学生专业技能大赛中职组“网络安全”赛项竞赛任务书(样题)

2022-2023 年度广东省职业院校学生专业技能大赛中职组“网络安全”赛项竞赛任务书&#xff08;样题&#xff09; 一、竞赛时间 总计&#xff1a;210 分钟 二、竞赛阶段 竞赛阶段 任务阶段 竞赛任务 竞赛时间 分值 A 模块 A-1 登录安全加固 90 分钟 200…

node笔记_express结合formidable实现前后端的文件上传

文章目录 ⭐前言⭐安装http请求的文件解析依赖库&#x1f496; 安装 formidable&#x1f496; node formidable接受formData上传参数 ⭐上传的页面搭建&#x1f496; vue2 element upload&#x1f496; node 渲染 上传文件 ⭐后端生成api上传文件到指定目录&#x1f496;完整的…

【Spring篇】Spring入门案例

&#x1f353;系列专栏:Spring系列 &#x1f349;个人主页:个人主页 目录 一、IOC入门案例 1.入门案例思路分析 2.入门案例代码实现 二、DI入门案例 1.入门案例思路分析 2.入门案例代码实现 三、图书推荐 介绍完Spring的核心概念后&#xff0c;接下来我们得思考一个问题…

2023年安徽省中职网络安全跨站脚本攻击

B-4:跨站脚本攻击 任务环境说明: √ 服务器场景:Server2125(关闭链接) √ 服务器场景操作系统:未知 √ 用户名:未知 密码:未知 1.访问服务器网站目录1,根据页面信息完成条件,将获取到弹框信息作为flag提交; 通过尝试知道这里存在xss漏洞

【CVE-2022-26134】Confluence OGNL RCE 漏洞

漏洞描述 远程攻击者在未经身份验证的情况下&#xff0c;可构造OGNL表达式进行注入&#xff0c;实现在Confluence Server或Data Center上执行任意代码。 影响版本 Confluence Server and Data Center > 1.3.0 Confluence Server and Data Center < 7.4.17 Confluenc…

九头蛇3389远程爆破

1.初学KALI hydra&#xff08;海德拉&#xff09;。 实验环境&#xff1a;VM16,虚拟机两台&#xff0c;Windows10系统&#xff0c;KALI系统&#xff0c;用nmap查看目标端口是否开放。 2.在KALI虚拟机上面使用命令nmap查看WIN10的3389端口是否打开。 3.在KALI虚拟机上面建立用…

Java sdk使用加载账户私钥调用合约

Java sdk使用加载账户私钥调用合约 1.智能合约案例 1.2 智能合约的流程 1.2 智能合约详细代码 实现了一个简单的商店功能。它定义了三个结构体&#xff1a;用户、商家和商品&#xff0c;以及对应的映射关系。它提供了一些方法用于注册用户和商家&#xff0c;创建商品&#x…

MVC模式和三层架构

MVC模式和三层架构 MVC模式三层架构MVC与三层架构的联系MVC与三层架构的异同 MVC模式 MVC&#xff08;Model View Controller&#xff09;是软件工程中的一种软件设计模式&#xff0c;它把软件系统分为模型、视图和控制器三个基本部分。用一种业务逻辑、数据、界面显示分离的方…

路由器+Gdbserver+IDA Pro远程调试

最近在复现路由器漏洞&#xff0c;也踩了不少坑&#xff0c;记录一下&#xff0c;希望能对需要的人有一些帮助。使用的路由器型号为RT-AC68U&#xff0c;ARM架构&#xff0c;小端序&#xff0c;Linux内核版本2.6.36&#xff0c;很老&#xff0c;主要的时间也花费在找能支持这个…

2023年最新版kali linux安装教程

一、前期准备 前排提醒&#xff0c;文末有绿色版安装包免费领取&#xff01; 二、VMware虚拟机配置 1、打开vmware&#xff0c;点击创建新的虚拟机 2、选择自定义(高级)选项&#xff0c;点击下一步 3、继续下一步 4、选择【稍后安装操作系统】&#xff0c;然后点击下一步 …

【Mybatis】使用mybatis框架连接mysql数据库详细步骤

和我之前写的通过导入jdbc驱动jar包来连接mysql数据库而言&#xff0c;用mybatis来说可以有很多好处呀&#xff0c;首先mybatis&#xff0c;就是对jdbc的优化方案对吧&#xff0c;&#xff0c;jdbc的硬编码和一些繁琐的操作在使用mybatis的时候我就彻底抛掷脑后了哈哈哈。 同时…

MySQL数据库下载及安装教程(最最新版)

MySQL数据库下载及安装教程&#xff08;最最新版&#xff09; 一、下载mysql数据库二、安装Mysql三、验证是否安装成功&#xff08;一&#xff09;、命令提示符cmd窗口验证&#xff08;二&#xff09;、MySQL控制台验证 一、下载mysql数据库 进入MySQL官方网站&#xff08;htt…

SVG实现中国地图

1.SVG是什么&#xff1f; svg 是Scalable Vector Graphics的缩写&#xff0c;指可伸缩矢量图形&#xff0c;可以用于绘制复杂不规则的控件。 svg绘制原理&#xff0c;就是利用了Path绘制图形。 1&#xff09;svg利用xml定义图形。在xml中就包晗了绘制Path所需的数据。 2&…