初识c语言(2)while循环


前言

通过以往的学习,我们已经掌握了if语句:

if(条件)

    语句;

当条件满足的情况下,if语句后的语句执行,否则不执行。但是这个语句只会执行一次。由于我们发现生活中很多实际的例子是:同一件事情我们需要完成很多次。那我们该怎么做呢?c语言中给我们引入了while语句,可以实现循环。

一、while循环

//while 语法结构

while(表达式)

          循环语句;

while语句执行的过程:

 

 比如我们在屏幕上实现:

打印1-10的数字。

 上面的代码已经帮助我们了解了while的基本语法,那我们再了解一下:

while中的break与continue

直接上代码

 总结:continue在while循环中的作用就是:

continue是用于终止本次循环的,也就是本次循环中continue后面的代码不会再执行,而是直接跳转到while语句的判断部分,进行下一次循环的入口判断。

再看一段代码:

 总结:其实在循环中只要遇到break,就停止后面的循环,直接终止循环。

所以:while中break是用于永久终止循环的。

特别注意:用break跳出循环时,break只能跳出最近的一层循环

二、多组输入与清理缓冲区

(一)多组输入的方法

1.EOF法

例子:while(scanf("%d %d",&a,&b)!=EOF)

scanf在读取数据时若遇到文件结束符时,会返回EOF(end of file),EOF是一个预定义的常量,等于-1,是文件结束的标志。

我们可以通过判断scanf的返回值是否为EOF来决定是否退出while循环。

终止循环的方法:Ctrl+Z

用法:要求输入的数据组数未知。

2.计数法

例子:while(scanf("%d %d",&a,&b)==2)

scanf返回值为正确输入的数据个数,就上诉例子而言,若用户输入两个整形数据,scanf函数返回值为2。

错误案例:while(scanf("%d %d",&a,&b)==1),scanf返回值是2而不是1,不满足循环条件,直接不进入循环

3.取反法

while(~scanf("%d",&a))

~是按位取反操作符,对-1按位取反的结果为0,循环结束

(二).while与清理缓冲区

scanf与getchar都是从缓冲区读取字符。

使用while循环达到多组输入的目的。

 图中的代码经过适当的修改是可以用来清理hu缓冲区的。

 通过观察,可以发现,上图中的代码显然没有达到预期的效果,在输入密码123456并按下回车键后,并没有执行确认密码(也就是不可输入Y/N键)的操作,而是直接显示“确认失败”,这又是为什么呢?

原来,这是因为键盘输入密码123456后占用了缓冲区。“\n"字符保留在缓冲区中,并作为下一个输

 入读取(被getchar()读取)。因此,需要额外的getchar函数“吸收”“\n"

 以下是简单的改进:

 然而,这样是正确的吗?很快,我们发现,这个代码有很大的局限性,如果我们的密码是

123456 abc,那么在密码中的123456被scanf函数从缓冲区读走后,缓冲区中还剩下很多字符(那是因为用scanf的形式读取字符串时,空格不能被读取,而一个getchar函数只能处理一个字符,因此,我们依然没有办法输入(Y/S)以达到确认密码的目的。

因此,我们可以这样做:

键入“while((getchar())!='\n');"读取缓冲区字符直到结尾并丢弃它们(包括换行符),并在"scanf()"语句清除输入缓冲区并允许输入所需的容器之后使用它们

这样,就能达到目的了。 

总结

以上就是今天要讲诉的内容,如有错误,欢迎大佬在评论区留言,期待与大家的共同进步!

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值