C(十一)scanf、getchar(第三弹)

news/2024/12/22 19:33:11/

问题引入:如何实现输入一串密码,如:“123   xxxx” ,然后读取并确认,是 -- Y;否 -- N。 

自然的,我们想到用scanf,但是在使用过程中你是否遇到跟我一样的困惑呢?如下:

打印的和输入的不一样???!!!

 这就不禁让我们思考:scanf到底是怎么读取数据的

其实,当我们输入“123 xxxx”时,我们都会敲一下空格键,对不对?

那么,这个时候,我们就向缓冲区输入了

而scanf不读取“空格”、"\n",所以scanf只会把123(隐含‘\0’)读走。

我们可以通过以下例子说明输入数据时还向缓冲区输入了‘\n’👉 

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{char mi_ma[20] = { 0 };printf("输入密码:>");scanf("%s", mi_ma);printf("请确认密码(Y/N):>"); //Y -- Yes ;N -- Noint ch = 0;ch = getchar(); //打算用getchar读取单个字符,即Y或Nif (ch == 'Y'){printf("确认成功\n");}else{printf("确认失败\n");}return 0;
}

运行结果👉

输入密码:>1234
请确认密码(Y/N):>确认失败

 都还没输入Y/N,直接就显示“确认失败”?!!!

————这是因为getchar读取的是‘\n’,而还不及读取Y/N。

改进如下:👉

tip:ch之所以定义为整型,是因为getchar()的返回值为对应字符的ASCII码值。

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{char mi_ma[20] = { 0 };printf("输入密码:>");scanf("%s", mi_ma);getchar();             //用来清除‘\n’printf("请确认密码(Y/N):>"); //Y -- Yes ;N -- Noint ch = 0;ch = getchar(); //打算用getchar读取单个字符,即Y或Nif (ch == 'Y'){printf("确认成功\n");}else{printf("确认失败\n");}return 0;
}

运行结果👉

输入密码:>1234
请确认密码(Y/N):>Y
确认成功

 回到一开始的问题👉

问题引入:如何实现输入一串密码,如:“123   xxxx” ,然后读取并确认,是 -- Y;否 -- N。 

认识到 scanf不读取“空格”、"\n"之后,又因为getchar()读取单个字符,所以我们不妨用多次getchar()读取“从空格到‘\n’之间的部分”。题解之一如下:👉

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{char mi_ma[20] = { 0 };printf("输入密码:>");scanf("%s", mi_ma);while (getchar() != '\n'){;}printf("请确认密码(Y/N):>"); //Y -- Yes ;N -- Noint ch = 0;ch = getchar(); //打算用getchar读取单个字符,即Y或Nif (ch == 'Y'){printf("确认成功\n");}else{printf("确认失败\n");}return 0;
}

运行结果👉

输入密码:>123 xxxx
请确认密码(Y/N):>Y
确认成功

http://www.ppmy.cn/news/1536143.html

相关文章

Qt_QSS介绍与使用

目录 1、QSS的语法介绍 2、QSS的基本使用 3、QSS的全局设置 4、样式的叠加特性 5、样式的优先级 6、使用Qt Designer设置样式 7、选择器种类介绍 7.1 类选择器 7.2 ID选择器 7.3 并集选择器 8、子控件选择器 9、伪类选择器 10、盒子模型 10.1 设置边框和内…

汽车生产四大工厂简单介绍

一、冲压工厂 这一工艺通过压力机和模具对板材施加外力&#xff0c;使之产生塑性变形或分离&#xff0c;从而获得所需形状和尺寸的工件。 二、焊接工厂 将各个冲压成型的部件通过加热或加压的方式连接在一起&#xff0c;形成白车身。焊接技术直接影响着汽车的使用性能&#…

28 基于51单片机的两路电压检测(ADC0808)

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于51单片机&#xff0c;通过ADC0808获取两路电压&#xff0c;通过LCD1602显示 二、硬件资源 基于KEIL5编写C代码&#xff0c;PROTEUS8.15进行仿真&#xff0c;全部资源在页尾&#xff0c;提供…

计算机毕业设计 基于深度学习的短视频内容理解与推荐系统的设计与实现 Python+Django+Vue 前后端分离 附源码 讲解 文档

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…

软件设计师(软考学习)

数据库技术 数据库基础知识 1. 数据库中的简单属性、多值属性、复合属性、派生属性简单属性&#xff1a;指不能够再分解成更小部分的属性&#xff0c;通常是数据表中的一个列。例如学生表中的“学号”、“姓名”等均为简单属性。 多值属性&#xff1a;指一个属性可以有多个值…

前端的全栈混合之路Meteor篇(二):RPC方法注册及调用

在Meteor 3.0中&#xff0c;RPC&#xff08;远程过程调用&#xff09;机制是实现前后端数据交互的重要特性。通过RPC&#xff0c;前端可以轻松调用后端方法&#xff08;Methods&#xff09;并获取数据&#xff0c;而后端的逻辑也可以同步或异步执行并返回结果。本文将详细介绍M…

Ubuntu 中 Redis ,MySQL 基本使用

1、Redis &#xff08;1&#xff09;启动Redis 服务端客户端命令 服务端 ps aux | grep redis 查看redis服务器进程 sudo kill -9 pid 杀死redis服务器 sudo redis-server /etc/redis/redis.conf 指定加载的配置文件客户端 连接redis&#xff1a; redis-cli运⾏测试命令&am…

数据结构--堆的深度解析

目录 引言 一、基本概念 1.1堆的概念 1.2堆的存储结构 1.3堆的特点 二、 堆的基本操作 2.1初始化 2.2创建堆 2.3插入元素 2.4删除元素 2.5堆化操作 2.6堆的判空 2.7获取堆顶元素 三、堆的常见应用 1. 优先队列 2. 堆排序 3. Top-k 问题 4. 图论中的应用 四…