前言
通过以往的学习,我们已经掌握了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()"语句清除输入缓冲区并允许输入所需的容器之后使用它们
这样,就能达到目的了。
总结
以上就是今天要讲诉的内容,如有错误,欢迎大佬在评论区留言,期待与大家的共同进步!