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

news/2024/4/27 18:40:43

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或Nif ('Y' == ret)printf("Yes\n");elseprintf("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或Nif ('Y' == ret)printf("Yes\n");elseprintf("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或Nif ('Y' == ret)printf("Yes\n");elseprintf("No\n");return 0;
}

成功运行!

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

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

相关文章

#QT(网络文件下载)

1.IDE:QTCreator 2.实验:从网络上下载devc 链接:http://crxzc.198424.com/dev-cpp_5.11_setup.zip 3.记录: (1)主界面 (2)check box (3)缺省路径的实现 voi…

音视频实战---读取音视频文件的AAC音频保存成aac文件

1、使用avformat_open_input函数打开音视频文件 2、使用avformat_find_stream_info函数获取解码器信息。 3、使用av_dump_format设置打印信息 4、使用av_init_packet初始化AVPacket。 5、使用av_find_best_stream查找对应音视频流的流下标。 6、使用av_read_frame读取音视…

jenkins指定jdk版本打包和运行项目

背景:因为jdk8安装jenkins有很多插件有问题,导致很多自动化编译都有问题,所以我jenkins使用jdk11进行安装。全局变量配置了jdk11,直接一键式命令安装jdk8会导致jenkins异常。 1、第一步,去下载jdk8版本解压。下载地址&…

【STL】stack栈容器与list链表容器

目录 1.栈stack 2.list链表容器 1.栈stack 栈具有先进后出的特性,最先进入的数据压在最底下,最后出来 2.list链表容器 list链表容器是一种双向链表,两端都可插入与删除,是双向访问迭代器,与vertor随机访问迭代器有不…

Etcd 介绍与使用(入门篇)

etcd 介绍 etcd 简介 etc (基于 Go 语言实现)在 Linux 系统中是配置文件目录名;etcd 就是配置服务; etcd 诞生于 CoreOS 公司,最初用于解决集群管理系统中 os 升级时的分布式并发控制、配置文件的存储与分发等问题。基…

2024/3/14打卡k倍区间(8届蓝桥杯)——前缀和+优化***

题目 给定一个长度为 N 的数列,A1,A2,…AN,如果其中一段连续的子序列 Ai,Ai1,…Aj 之和是 K 的倍数,我们就称这个区间 [i,j] 是 K 倍区间。 你能求出数列中总共有多少个 K 倍区间吗? 输入格式 第一行包含两个整数 N 和 K。 以下 N…