当前位置: 首页 > article >正文

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

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

成功运行!


http://www.kler.cn/a/272978.html

相关文章:

  • 【Python基础篇】——第3篇:从入门到精通:掌握Python数据类型与数据结构
  • C语言初阶习题【30】字符串左旋
  • mac下安装nvm的node版本管理工具
  • 微信小程序获取openid
  • 微信小程序原生与 H5 交互方式
  • IDEA编译器集成Maven环境以及项目的创建(2)
  • docker引擎
  • 德迅蜂巢(容器安全)全面出击
  • windows平台Qt5连接wifi
  • Linux重命名文件有几种方法
  • [java基础揉碎]Object类详解
  • web蓝桥杯真题:成语学习
  • C++容器适配器与stack,queue,priority_queue(优先级队列)的实现以及仿函数(函数对象)与deque的简单介绍
  • XSS基础知识
  • C# 如何解决主线程堵塞问题
  • 归并排序思路
  • el-select 选择后获取key 和label的值
  • STM32实验DMA数据搬运小助手
  • 使用JDK11字段http客户端发送http请求
  • CentOS 7 基于开源项目制作openssh 9.7p1二进制rpm包(内含ssh-copy-id、显示openssl版本信息)—— 筑梦之路
  • 什么是浅拷贝和深拷贝
  • 位运算,LeetCode 2749. 得到整数零需要执行的最少操作数
  • 全网最全的幻兽帕鲁服务器搭建教程——阿里云保姆级教程
  • 【小迪安全】学习cho1
  • github 中的java前后端项目整合到本地运行
  • 排序算法:快速排序(递归)