getchar与scanf的区别

2023-11-02

  1. getchar

getchar先读取一个字符放到ch里面去,如果这个字符不等于EOF,就进入循环,打印这个字符。当getchar读到文件末尾或者结束时,它会返回一个EOF,此时结束循环。

输入A,输出A;输入b,输出b…

当我们想要结束时,输入ctrl+Z,再按回车即可。

注意:如果上面的代码不用while循环的话,输入123,putchar()只会输出1。因为一个getchar一次只能读取一个字符。

(1)这是为什么呢,程序的运行过程是这样的,getchar 有一个 int 型的返回值。当程序调用 getchar 时,程序就等着用户按键。用户输入的字符被存放在键盘缓冲区中,直到用户按回车为止(回车字符 \n 也放在缓冲区中),当用户键入回车之后,getchar() 函数才开始从输入缓冲区中每次读取一个字符,getchar 函数的返回值是用户输入的字符的 ASCII 码,若遇到文件结尾 (End-Of-File) 则返回 -1 (EOF),并将用户输入的字符回显到屏幕,如果用户在按回车之前输入了不止一个字符,其他字符会保留在键盘缓存区中,等待后续 getchar 调用读取。也就是说,后续的 getchar 调用不会等待用户按键,而直接读取缓冲区中的字符,直到缓冲区中的字符读完后,才等待用户按键。程序中 while 循环工作时,每一次循环 getchar() 就会从输入缓冲区读取一个字符,然后 putchar 输出,直到遇到了文件结束标志 EOF,循环判断条件为假,循环才结束

(2)我们来看看它其中的原理:

scanf和getchar都是输入函数,它们都是从键盘上来读取我们的数据,但它们不是直接从键盘上来读取我们的数据。它们和键盘之间有一个区域叫缓冲区。

输入函数先来看缓冲区中是否有数据,如果有,它直接就拿走了,不需要从键盘输入,如果缓冲区什么都没有,则需要从键盘输入,再拿走。

2.注意区分 getchar 和 scanf

对于 scanf 函数,'\n' 会触发 scanf 读取输入缓冲区的内容,但遇到 '\n' 或空格 ' ' 会停止读取,而 getchar 会直接读取 '\n' 和空格

3.getchar 的使用实例

输入密码 123456 之后,程序没有让我们确认密码,直接判断确认失败了,为什么会出现这样的结果呢?

当我们在键盘上输入密码并按下回车后,键盘缓冲区有 ‘1’ ‘2’ ‘3’ ‘4’ ‘5’ ‘6’ ‘\n’ 这些字符,此时 scanf 函数开始读取字符串 ‘1’ ‘2’ ‘3’ ‘4’ ‘5’ ‘6’ ,遇到 ‘\n’ 结束读取,这时运行到后面的 getchar 函数了,getchar 发现缓冲区里还有一个 ‘\n’ ,直接将其读取走并会返回给整型变量 ch,这时没有多余的 getchar 函数来接收字符 ‘Y’ 或者 ‘N’ 了,轮到 if 语句来判断时,ch 不等于 ‘Y’ ,输出 defeat!

那我们怎么改进,让字符 ‘Y’ 或者 ‘N’ 得以被接收呢,猜你已经想到了,那就是在 ch = getchar(); 语句前面增加一条 getchar(); 语句,来读取处理掉 ‘\n’ ,这样用来确认密码的那个 getchar 函数就可以接收字符 ‘Y’ 或者 ‘N’ 了

继续思考,如果我输入密码时多输了一些无用的字符,又该怎么样处理掉它们呢?比如输入 123456 abcdf\n

很自然就能想到需要先把缓冲区里清空

那我们就在前面加一个getchar把缓冲区中的“\n”给清理掉。

即代码变为

4、输入的密码中有空格

不过又有一个问题,当我们输入密码为123456 789时(中间有一个空格),还没等我们输入N或Y,又立马跳出了“确认失败”。

这又是怎么回事呢?我们一起来看看

(1)原理详解

首先缓冲区里没有东西,我们需要通过键盘输入密码123456 789,

然后scanf就来取缓冲区中的数据,当它读到空格的时候,它就不再读了(这是scanf的一个作用性质)。

所以scanf就只取走了123456,而缓冲区中还剩下(空格) 789\n。

再往下,运行到getchar();这行代码,然而这里只有一个getchar,它只能读取一个字符,也就是只读了空格,缓冲区中还剩789\n。

再往下,就是我们的这行代码int ch = getchar();

getchar()一来就取走了缓冲区中的7,根本不需要我们从键盘输入N或Y。运行时自然它就自动跳出了“确认错误”。

(2)解决措施

所以我们需要把缓冲区中的东西先全部清走

那我们就用一个循环,只要没读到\n,我们就一直用getchar读

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

getchar与scanf的区别 的相关文章

  • Python基础:按位异或 ^ ,按位或

    前言 文的文字及图片来源于网络 仅供学习 交流使用 不具有任何商业用途 版权归原作者所有 如有问题请及时联系我们以作处理 PS 如有需要Python学习资料的小伙伴可以加点击下方链接自行获取http t cn A6Zvjdun 使用按位异或
  • JDK8 JVM参数与实际环境中的优化配置实践

    如何配置我们的JVM呢 首先我们需要知道JVM的参数有哪些 然后根据这些参数的意义去分析自己的程序的JVM需要的配置 可以事先做一些尝试 再逐步调优 这个调优也是一个过程 没有足够的经验而做到一步到位是一件很困难的事情 事情是一点点做的 不

随机推荐

  • 关于内存的编程题,对异常: 0xC0000005 的分析以及解决办法

    一 内存的思考题 请问运行Test函数会有什么样的结果 第一题 void GetMemory char p p char malloc 100 void Test void char str NULL GetMemory str strcp
  • Node.js到底是个啥?干什么用的?优缺点是什么?

    Nodejs简介 Node js是一个Javascript运行环境 runtime 是一个可以快速构建网络服务及应用的平台 是用Javascript语言构建的服务平台 可用于后端建立服务器 Node js与Javascript的区别 nod
  • error: cannot call member function ‘void me::sendMessage()‘ without object

    error cannot call member function void me sendMessage without object 原因分析 解决方案 原因分析 在connect中 传递函数地址不用带括号 参考函数指针的赋值 incl
  • 将tensorflow模型部署到服务器上

    基本思路 利用tensorflow官方提供的tensorflow serving进行部署 同时 为了免去环境配置等麻烦操作 可借助docker容器 一 服务器环境选择 首先肯定要去租一个服务器 例如阿里云 一开始选了window serve
  • C++ 如何调用 通过Boost.python 封装的python函数(安装与配置注意事项)

    一 下载好相匹配的版本python与boost 1 建议使用新版的比较方便 也没有太多的bug 2 我使用的Boost 库是1 82 0 点击下载 Boost 1 82 0 3 使用的是python 3 10 11版本 点击下载 pytho
  • 【代码扫描修复】绝对路径遍历(高危)

    漏洞描述 摘要 允许用户输入控制文件系统操作所用的路径会导致攻击者能够访问或修改其他受保护的系统资源 缺陷描述 当满足以下两个条件时 就会产生路径遍历错误 攻击者可以指定某一文件系统操作中所使用的路径 攻击者可以通过指定特定资源来获取某种权
  • SpringMVC架构浅析

    SpringMVC概述 Spring的web框架围绕DispatcherServlet设计 DispatcherServlet的作用是将请求分发到不同的处理器 Spring的web框架包括可配置的处理器 handler 映射 视图 view
  • 服装销售管理系统---课程设计(C/C++简易版)

    目录 基于大一学期对C C 的学习做的一个关于实现一个服装销售管理系统的课程设计 强化自己关于面向对象 OOP 编程思想 耗时4 5天左右 功能大抵实现 流程图 源代码 总结 基于大一学期对C C 的学习做的一个关于实现一个服装销售管理系统
  • 腾讯安全技术类面试

    初试 2014 09 23 被分配到 安全技术类 在海航威斯汀酒店 五楼签到 面试房间2009 时间14 30 因为没有把握 反正要被刷掉的 于是我随便穿了一件红色的短衬衫和黑色的小短裤就去了 发现好冷 面试的时候又很饿 那个房间关门了 按
  • STM32F103芯片的基本硬件设计:下载、复位、启动设置、晶振

    1 下载口 一般情况下我们都是用SWD方式下载 一般有两种接线方式 一种4线 VCC GND SWDIO接10K上拉 SWCLK接10K下拉 一种是5线的 在4线的基础上增加了一个NRST上拉10K 但其实没必要 因为NRST是复位脚 电路
  • 变态青蛙跳台阶的两种典型分析方法

    变态青蛙跳台阶的两种典型分析方法 最近看到递归相关的算法 有个变态青蛙跳台阶的延伸问题还蛮有趣的 题目如下 拿出来分析一下 一只青蛙一次可以跳上1级台阶 也可以跳上2级 它也可以跳上n级 求该青蛙跳上一个n级的台阶总共有多少种跳法 方法一
  • python爬虫招聘网站(智联)

    2021年10月7日爬取 爬虫代码不知道是否失效 文章目录 爬虫目标 具体过程 源码 爬虫目标 要求 搜索 大数据 专业 爬相关公司的招聘信息 列数不少于10列 行数不少于3000 目标 搜索 大数据 爬取智联招聘 北京上海广州深圳天津武汉
  • maven查看jar的pom引入来源

    从idea中点击 Maven Projects 后点击Show Dependencies 如图所示 得到依赖关系图 如下 在页面进行 Ctrl F 搜索需要的 Jar 名称 例 查找 spring beans 双击框定的地方 就能进入到对应
  • 一分钟快速利用ChatGPT生成PPT

    目标 让AI给我们生成一篇PPT报告 首先介绍一下什么是ChatGPT ChatGPT是一种基于自然语言处理技术的人工智能应用 它使用OpenAI的GPT模型来自动生成自然语言的回复 可以作为虚拟助手 客服机器人等方面的应用 与其他机器学习
  • SOC芯片中VIP和IP之间的路由关系

    通用PAD是双向端口 inout 这就意味着每个通用PAD可以根据需要被配置成输入或输出 如图1所示 图1 ind是输入端口 do是输出端口 obe是输出使能信号 当obe为低电平时 PAD作为输入端口使用 三态门关闭 do高阻 片外数据通
  • nm 命令显示

    用途 显示关于对象文件 可执行文件以及对象文件库里的符号信息 语法 nm A C X 32 64 32 64 f h l p r T v B P e g u d o x t Format File 描述 nm 命令显示关于指定 File 中
  • FISCO BCOS工程师常用的性能分析工具推荐

    FISCO BCOS是完全开源的联盟区块链底层技术平台 由金融区块链合作联盟 深圳 简称金链盟 成立开源工作组通力打造 开源工作组成员包括博彦科技 华为 深证通 神州数码 四方精创 腾讯 微众银行 亦笔科技和越秀金科等金链盟成员机构 代码仓
  • Hibernate学习笔记 查询简介

    创建实体类 在介绍Hibernate查询语言之前 首先我们来建立一下数据库 这里直接使用了MySQL自带的样例数据库world 如果你没有安装MySQL那么需要安装一下 并且在安装的时候选择安装样例数据库 安装完成之后 应该能在MySQL中
  • 《区块链技术与应用》学习笔记13——ETH权益证明

    矿工挖矿是为了取得出块奖励 获取收益 而系统给予出块奖励的目的是激励矿工参与区块链系统维护 进行记账 而挖矿本质上是看矿工投入资金来决定的 投入资金买设备 gt 设备决定算力 gt 算力比例决定收益 那么 为什么不直接拼 钱 呢 现状是用钱
  • getchar与scanf的区别

    getchar getchar先读取一个字符放到ch里面去 如果这个字符不等于EOF 就进入循环 打印这个字符 当getchar读到文件末尾或者结束时 它会返回一个EOF 此时结束循环 输入A 输出A 输入b 输出b 当我们想要结束时 输入