循环语句之 while

本文详细介绍了C++中while循环的使用,包括break和continue语句的实践,以及getchar和scanf在处理键盘输入时的注意事项。通过示例代码解析了输入缓存区的影响,强调了如何正确处理输入以避免意外结果,并提出了有效的解决方案。

目录

基本结构

 while中的break

 while中的continue

C++中的while:putchar,getchar

getchar:从键盘获取字符

putchar:把字符打印到屏幕

EOF:end of file 文件结束标志


基本结构

while(表达式)

        {循环语句;}

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
	while (1)
	{
		printf("循环语句");
	}
	return 0;
}

代码运行结果:循环语句循环语句循环语句……

因为没有终止命令,会一直打印下去

 while中的break

  1.  加了break后的运行结果只打印一次循环语句
    int main()
    {
    	while (1)
    	{
    		printf("循环语句");
    		break;
    	}
    	return 0;
    }
  2. while中的break用于永久终止循环,即while循环中只要遇到break就停止后面所有语句,跳出循环    
    int main()
    {
    	int i = 0;
    	while (i < 10)
    	{
    		if (7 == i)
    			break;
    		printf("%d\n", i);
    		i++;
    	}
    	return 0;
    }

    运行结果为:

 while中的continue

  1. #define _CRT_SECURE_NO_WARNINGS 1
    #include<stdio.h>
    int main()
    {
    	
    		int i = 0;
    		while (i < 10)
    		{
    			if (7 == i)
    				continue;
    			printf("%d\n", i);
    			i++; 
    		}
    	return 0;
    }
    运行结果为:
  2. continue作用是跳过本次循环continue后面的代码,直接到while循环的判断部分,可以用F10逐句运行,打开监视器,观察运行情况,可以看出语句在判断和continue语句之间反复运行
  3. 使用场景:在某一次中不想继续处理了,直接进入下一次循环过程的场景
  4. int main()
    {
    	int i = 1;
    	while (i <= 10)
    	{
    		i++;
    		if (5 == i)
    			continue;
    		printf("%d\n", i);
    	}
    	return 0;
    }

    运行结果为可以验证continue语句的作用

C++中的while:putchar,getchar

getchar:从键盘获取字符,一次只取一个字节

putchar:把字符打印到屏幕

EOF:end of file 文件结束标志

  • getchar读取结束或失败就会返回EOF
  • 返回的字符,本质是字符也是ASCII码值,是整数
  • getchar函数不仅仅是返回正常字符,还会返回EOF是-1,所以放在整型变量中
  • 应用场景 
int main()
{
	int ch = 0;
	while ((ch = getchar()) != EOF)
		putchar(ch);
	return 0;
}

输出如下:

结束程序:输入EOF→回车→输入Ctrl+Z

int main()
{
	int ch = 0;
	char password[20] = { 0 };
	printf("请输入密码:");
	scanf("%s", password);//数组名本来就是地址,不加&;变量要加&
	printf("请输入密码(Y/N):");
	ch = getchar();
	if (ch == 'Y')
	{
		printf("确认成功\n");
	}
	else
	{
		printf("确认失败\n");
	}
	return 0;
}

运行结果:

运行时发现缺少确认的一步

  • getchar 和 scanf,实际并非从键盘获取,要输入东西之前,输入缓存区为空,键盘输入且回车后,放入输入缓存区,scanf再将内容取出,将回车(\n)留在输入缓冲区。当执行getchar 命令时,getchar将输入缓存区内的回车(\n)取出,赋值给ch。在if语句中 判断为假,输出确认失败。
  • 若要使代码正确,关键是如何处理输入缓存区的回车(\n)。
int main()
{
	int ch = 0;
	char password[20] = { 0 };
	printf("请输入密码:");
	scanf("%s", password);//数组名本来就是地址,不加&;变量要加&
	getchar();//清理\n,这个getchar把回车拿走了,存到哪里不重要
	printf("请输入密码(Y/N):");
	ch = getchar();//到这个getchar时,输入缓存区为空,等待输入
	if (ch == 'Y')
	{
		printf("确认成功\n");
	}
	else
	{
		printf("确认失败\n");
	}
	return 0;
}

上述解决方法可以处理,但并不推荐。

当输入如上图所示时,又显示确认失败。

原因:scanf将输入缓存区中的【abcdef 1234\n】以%s方式读走【abcdef】,补加的getchar将后面的空格取走,显示请确认密码后的getchar读取【1】,所以确认失败。

int main()
{
	int ch = 0;
	char password[20] = { 0 };
	printf("请输入密码:");
	scanf("%s", password);//数组名本来就是地址,不加&;变量要加&
	while ((ch = getchar()) != '\n')//读1234的时候系统什么都不干
	{
		;//这里不写分号也没问题,写上是一种好习惯,代表空语句
		//即正常情况下应当有语句,但是这里不希望它执行任务
	}//清空输入缓存区
	printf("请输入密码(Y/N):");
	ch = getchar();
	if (ch == 'Y')
	{
		printf("确认成功\n");
	}
	else
	{
		printf("确认失败\n");
	}
	return 0;
}

这里的主要问题是从键盘输入后,存储在输入缓存区(包括回车),scanf根据指令(%s,%d……)读取相应内容,要考虑输入缓存区中剩余的内容,避免getchar直接将内容取走,导致系统没有等待时间,即不给我们输入Y\N的时间,直接判断确认成功/失败。

解决的关键是用while、getchar和空语句清空输入缓存区。

好难好难😢慢慢理解

希望大家多多批评指正!

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值