关于getchar的用法及实例解析

2023-05-16

一、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的用法的实例解析。如果对你有帮助,记得点赞👍+关注哦!
我的主页还有其他文章,欢迎学习指点。关注我,让我们一起学习,一起成长吧!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

关于getchar的用法及实例解析 的相关文章

  • 八种排序算法和耗时

    读取文件big a txt的数据 xff08 包含500000个随机数 xff0c 1 5000000 xff09 xff0c 利用插入排序 希尔排序 xff0c 冒泡排序 快速排序 选择排序 堆排序 xff0c 归并排序 基数排序8种排序
  • Centos7.x升级内核

    文章目录 引言安装elrepo并修改为默认从清华源下载查看可用内核安装包 更新内核卸载多余的内核安装稍微没那么新版本的内核 引言 默认情况下Centos7 9的内核是3 10 xff0c 咱们给他升级一下 span class token
  • 自动化测试工具——Selenium详解

    目录 前言 Selenium的几个特点 seleniun组成部分 selenium RC selenium IDE selenium Grid selenium webDriver 那么selenium RC 与webdriver 主要有什
  • 远程访问及控制SSH 服务

    目录 前言 一 SSH概述 二 SSHD服务 2 1 远程登录 2 2 文件传输 三 SSH服务配置 3 1 SSH服务安全调优 3 2 SSH服务验证 四 密钥对构建 4 1 密钥对原理 4 2 远程拷贝 scp 4 2 1 本地文件复制
  • 前端 - get请求传递数组,出现400 Bad Request错误。

    原因 xff1a 如果请求参数中带有中括号 xff0c 在url中属于功能性字符 xff0c 入参会发生变化 xff0c 出现400 Bad Request错误 你提供的入参 params 61 b 1 2 3 后端接受到的参数 param
  • @Autowired自动装配原理

    一 64 Autowired自动装配 当我们在IDEA中不使用xml配置文件的时候 xff0c 这时候我们就需要 64 Autowired注解 xff0c 该注解的原理如下 xff1a 1 在启动Spring IOC时 xff0c 容器自动
  • zabbix邮箱告警

    1 1 邮件通知 xff1a 通过企业邮箱 第三方服务商邮箱发送报警邮件通知运维工程师 1 2 邮箱开启SMTP xff1a 如果是QQ邮箱需要单独开启SMTP xff0c 其他邮箱具体联系服务商 确认是已经打开状态 xff0c 如果是未开
  • 配置本地yum源仓库

    配置本地yum源仓库 mount dev cdrom mnt 把光盘挂在到mnt目录下 xff0c xff0c xff0c 因为制作本地yum仓库 xff0c 其目的是需要 rpm文件 xff0c 但是不借助网络 xff0c 本地只有iso
  • MySQL完全备份与恢复

    文章目录 MySQL完全备份与恢复数据备份的重要性数据库备份的分类从物理和逻辑角度分1 物理备份2 逻辑备份 从数据库的备份策略角度 xff0c 备份可分为常见的备份方法MySQL完全备份 优点 缺点 差异备份增量备份 备份方式的比较数据库
  • 成长记录-开启我的新生 (2016-12-06)

    真的是很惊险 xff0c 我差一点就错过了 获得新生 的机会 xff0c 我在蜻蜓音频中听到了逻辑思维 xff0c 从逻辑思维中了解到了 得到 xff0c 从 得到 中订阅了吴军博士的 硅谷来信 xff0c 却在过去的好几个月里 xff0c
  • Maven搭建Mybatis框架详解

    本章我们主要讲述在Maven管理系统下 xff0c 引入Mybatis框架的流程 xff0c 大致分为四个部分 xff1a 1 Maven的环境配置及其项目创建 2 利用Maven的依赖管理 xff08 坐标定位 xff09 导入Mybat
  • 生产者--消费者问题算法的实现

    一 知识背景 1 xff0e 进程管理 2 xff0e 信号量的有关知识 二 目的 1 xff0e 了解信号量的使用 2 xff0e 加深对信号量机制的理解 三 要求 1 xff0e 理解生产者与消费者问题模型 xff0c 掌握解决该问题的
  • 添加修改数据时前端报400的原因

    1 向后端提交的字段跟数据库中的字段对不上 当我们添加或者修改数据时 xff0c 前端跟后端的字段可能对不上 xff0c 如果没有让前后端的字段名保持一致 xff0c 就会导致数据不能正常添加到数据库 xff0c 因此会报400 2 对于某
  • 数组蛇形排序,优质解决方案

    目录 1 题目要求 xff0c 按照指定的行列号内 xff0c 数组按照蛇形的规律排列 xff0c 1 题目要求 xff0c 按照指定的行列号内 xff0c 数组按照蛇形的规律排列 xff0c 比如 1 2 6 7 3 5 8 13 4 9
  • (经典C语言题)1.输入3个字符串,要求按由小到大的顺序输出

    1 总体思路 字符串的比较可以使用 strcmp 函数 xff0c 返回值 gt 0 表示大于 xff0c 返回值小于 0 表示小于 xff0c 返回追等 于 0 表示相同 其他的比较排序思路与数字的排序交换没有区别 xff0c 逐个进行比
  • 【经典C语言题】输入10个整数,将其中最小的数与第一个数对换, 把最大的数与最后一个数对换,要求是使用三个函数

    1 先用函数输入10个数 xff0c 再调整 xff0c 最后输出 2 整体思路 在进行数值逐个比较的同时找到最小值的空间地址以及最大值的空间地址 xff0c 使用这两个空间 中的数据最终与第一和最后数据进行对换即可 3 上代码 1 先解决
  • (C语言经典题)有n个整数,使前面各数顺序向后移m个位置,最后m个数变成最前面m个数,

    解题思路 1 2 3 4 5 6 7 8 9 前面都向后移动2的话 8 9 1 2 3 4 5 6 7 可以看出就是8 9 换到前面了 先保存最后一位的值9 xff0c 然后前面的所有数字后移一位 xff0c 再把9放到第一位 接下来就是重
  • git简单使用流程

    通过 git status 查看文件的状态 stage 暂存 commit 提交 history 历史 git本地库 push 推送 pull 拉取 remote 远的 repository 仓库 clone 克隆 上传step 1 git
  • MT8788 Android11 修改默认字体,字体大小和像素密度

    环境 MT8788 Android11 ili9881p hd720 dsi vdo 1 修改默认语言 目录 b device mediateksample tb8788p1 64 bsp vnd tb8788p1 64 bsp mk 内容
  • MT8788 Android11 tp 启动流程

    环境 MT8788 Android11 focaltech touch HD720 5寸tp log信息 分析步骤 一 获取dts信息 和 添加驱动到内核 1 获取dts设备树中配置的信息 2 将tp厂商的驱动文件注册添加到 tpd dri

随机推荐

  • 最新Java电子书

    最新Java电子书 JAVA参考大全 J2SE 5EDITION 世界级程序设计大师作品 Thinking in Java第三版 43 第四版 xff08 中文版 43 习题答案 xff09 Java数据库高级编程宝典 Java核心技术第八
  • 关于mtk配置文件的一些说明

    一 ProjectConfig mk 共三种区别 1 AUTO ADD GLOBAL DEFINE BY NAME类型 xff1a 将它后面的名字 xff0c 定义为宏是没有初始值的 define XXX 2 AUTO ADD GLOBAL
  • 监控平台(windows版本)使用SDK的方式接入摄像头

    一 登录进入监控平台管理端 二 添加设备 1 依次点击左侧菜单栏中业务管理 设备管理 xff0c 进入到设备管理界面 如下图 2 点击设备列表字样下的添加按钮添加设备 如下图 3 在添加设备中按如下方式填写 设备编号 可根据需求自行填写 国
  • 认识HTML

    目录 HTML介绍HTML结构HTML常用标签注释标签标题标签段落标签和换行标签格式化标签图片标签超链接标签表格标签列表标签表单标签form和input标签其他标签 无语义标签 HTML特殊字符 HTML介绍 HTML全称是超文本标记语言
  • spring超全面详解

    spring概述 Spring 是于2003年兴起的一款轻量级的 非侵入式的IOC和AOP的一站式的java开发框架 为简化企业级应用开发而生 1 轻量级 就是指spring核心功能的jar包不大 2 非侵入式 我们的业务代码不需要继承或实
  • 虚拟机怎么从图形界面转到命令行(去掉桌面)

    点击 xff1a ctrl 43 alt 43 F1切换到桌面 点击 xff1a ctrl 43 alt 43 F5切换命令行 xff08 去掉桌面 xff09
  • springboot是怎么实现自动配置的?

    一 springboot是对spring框架做的一系列优化 xff0c 减少了大量繁琐的配置 xff0c 并提供了内置web服务器 xff0c 让程序运行更快 1 springboot起步依赖 xff1a 简单的说 xff0c 起步依赖就是
  • 第三章 Linux文件目录查找

    Find命令 find命令在Linux中搜索效果非常不错 xff0c 不仅可以按照文件名搜索文件 xff0c 还可以按照权限 时间 容量大小等来搜索文件 xff0c 但是find命令它是通过递归式在硬盘中进行搜索的 xff0c 如果指定的搜
  • 超市购物小程序

    编写一个超市购物程序 xff0c 在一家超市有牙刷 毛巾 水杯 苹果和香蕉五种商品 xff1a 拥护输入序列号进行购物 xff0c 并在输入购物数量后算出所需花费及退出购物时的总花费 一次购买结束后 xff0c 需用户输入 34 Y 34
  • 链游是什么?

    链游 从字面上理解它就是区块链上的游戏 xff0c 也被称作gamefi xff08 Gaming and Decentralized Finance xff09 在国内也被称为金融性游戏 在链游中玩家除了能够有玩游戏的体验之外也能够参与交
  • 出现error ‘props‘ is defined but never used 这种eslint相关的报错,关闭eslint的方法

    最近做项目遇到如下报错 xff1a cmd终端中 xff1a 为了关闭这个eslint报错 xff0c 可以用如下方法 xff1a 针对自己创建的新项目的话 xff0c 是在项目文件夹中的vue config js 中 此处项目是用Vue
  • 关于JAVA中内存溢出的解决办法

    关于JAVA中内存溢出的解决办法 J2ee应用系统是运行在J2EE应用服务器上的 xff0c 而j2ee应用服务器又是运行在JVM上的 xff0c 生成环境中JVM参数的优化和设置对于J2EE应用系统性能有着决定性的作用 要优化系统 xff
  • 用FTPClient上传文件,执行this.ftpClient.storeFile(fileName, inStream)报错

    this ftpClient storeFile fileName inStream 方法执行时无反应 xff0c 最后提示错误 原因 xff1a 代码中加了多了一个设置 this ftpClient enterLocalPassiveMo
  • Python+ADB脚本

    目录 准备工具 问题解决 xff1a 如何安装adb和python xff1f 编写程序 实现 注意 xff1a 准备工具 进入正题 xff0c 首先要准备的工具如下 1 一台正常的电脑且安装adb和python环境 2 一部安卓手机 4
  • springboot+vue+协同过滤算法电影推荐网站

    源码获取 xff1a 文末获取联系方式 xff01 一 项目运行 环境配置 xff1a Jdk1 8 43 Tomcat 8 5 43 Mysql 43 VUE 43 IDEA xff08 Eclispe MyEclispe Sts都支持
  • Ubuntu20.04下基于ROS和PX4的无人机仿真平台的基础配置搭建(我所遇到的问题)

    写在前面 xff1a 我目前也处于学习阶段 xff0c 当时按照ROS教程安装的20 04 xff0c 随后搭建XTDrone阶段因为版本问题出现了很多问题 xff0c 这是我根据问题 xff0c 检索后汇总的一些解决措施 本文中提到的问题
  • 手机如何远程连接linux系统的VPS

    1 首先下载安装APP xff1a iTerminal 2 运行iTerminal xff0c 然后点击SSH栏 3 然后按要求填入各项内容 xff0c 确认都正确后点击底下的连接按钮 4 如图连接成功后即可在手机上操作了
  • 学习总结

    错误 xff1a TypeError ERR INVALID ARG TYPE The 34 id 34 argument must be of type string Received an instance of IncomingMes
  • Java笔记_3(循环)

    Java笔记 3 一 判断与循环1 1 顺序结构1 2 分支结构1 2 1 if语句1 2 2 switch语句 1 3 循环结构1 3 1 for循环1 3 2 while循环1 3 3 do while循环 1 4 回文数的判断1 5
  • 关于getchar的用法及实例解析

    一 getchar 函数是什么 xff1f getchar 函数是获取一个字符 说到这里就有人问了 xff0c 为什么他的返回类型是int xff1f 因为实际上EOF 61 end of file xff08 1 xff09 xff0c