循环语句
while
for
do while
while循环
我们已经掌握了if语句:【注:条件为真,语句执行】
if(条件)
语句;
当条件满足的情况下,if语句后的语句执行·;否则不执行。
但是这个语句只会执行一次。
但是我们发现生活中很多的实际的例子是:同一件事情我们需要完成很多次。
那我们该怎么做呢?C语言中给我们引入了:while语句,可以实现循环。
如:
int main(){
while(1) //这里恒为真,会一直循环
printf("hehe\n");
return 0;
}
while语法结构:
while(表达式)
循环语句;
条件表达式若为真,则会进入循环语句,然后再到条件表达式中去判断,依次往复,直至为假,跳出循环。
while语句执行执行的流程:
这里expr指表达式,!=0指非0, stmt指语句。
打印1~10
int main(){
int i=1;
printf("%d ",i);
i++; //这里指打印为1,但我们想依次打印,就加上了i++
return 0;
}
添加循环:
int main(){
int i=1;
while(i<=10){
printf("%d ",i);
i++;
}
return 0;
}
大家可以去试着去运行这串代码,这里在提一点——如果以后想看代码具体如何执行,可以按F10或Fn+F10,打开监视窗口(调试状态下),这也是判断代码出错的原因的方法。
在看一串代码
int main(){
int i=1;
while(i<=10){
if(i==5)
break;
printf("%d ",i);
i++;
}
return 0;
}
打印结果1 2 3 4
这里的break是指如果i等于5的话,由于break是停止的意思,即跳出循环,所以5就没有打印了。
也就是说未来如果在循环里面,我希望哪一个条件满足的情况下,循环停止的话,就可以用到break。
若将break换成continue的话——
打印结果为1 2 3 4 ,但这时光标会一直在闪,没有截止也没有终止
若这个程序截止的话,会出现“按任意键继续”,但这个程序并没有结束,而是陷入了死循环。
补充:continue是继续的意思。
i不等于5,代码往后走,但遇到continue则会不执行后面,再次进入循环。
continue的作用是当我们循环内部有机会执行道continue的时候,continue后面的代码便不再继续执行,直接认为这次循环结束了,再次来到while的条件表达式去判断。
简单来讲就是指跳过本次循环后面的代码。
while(i<=10){
i++;
if(i==5)
continue;
printf("%d ",i);
}
总结:
1、break在while循环中的作用——在循环中只要遇到break,就停止后期的所有循环,直接终止循环。
所以,while中的break是用于永久终止循环的。
2、continue在while循环中的作用——continue是用终止本次循环的,也就是本次循环中continue后面的代码不会在执行,而是直接跳转到while语句的判断部分,进行下一次循环的入口判断。
代码1:
#include<stdio.h>
int main(){
int ch=0;
while((ch=getchar())!=EOF)
putchar(ch);
return 0;
}
这里while((ch=getchar())!=EOF)中
getchar——get获取 char字符——获取字符 意思:接受键盘输入的字符
整体意思是:获取一个字符后放到ch里面去,然后看获取的字符是不是EOF;如果等于EOF,那就把字符打印出来,也就是说这个循环只有获取到EOF才能够停下来,但不单单是这么简单。
补充:与输入getchar相对应是输出putchar;其实putchar与printf("%c\n",ch);是一样的,只是形式上的简洁区别。
在分析:
int main(){
int ch=getchar();
putchar(ch);
printf("%c\n",ch);
return 0;
}
试着在调试窗口下输入e,则回车为ee。(当然其他字母也可以)
注意:这里并不是说输入EOF就会停止下来。
因为EOF在输进去的时候,一下子敲了三个字符,敲了个E,敲了O和敲E;那这个时候,getchar会读三次,读一个E打印,读一个O打印,读一个F打印就完了。
这里,getchar获取一个EOF的方式是在键盘上输入Ctrl+z,回车后程序结束。
这是因为,getchar如果遇到ctrl+z的时候,getchar就会获取到EOF
EOF放到ch里面去,因EOF !=EOF为假,循环停止。
EOF——end of file—— -1
它本身就是-1这样的值。(右击“EOF”点“转到定义”)会发现EOF是文件结束标志。有点像“\0”,但又不一样。
未来,在学习文件的时候,一个空文件往这一放,第一次让你从里面去读一个字符的时候,会读出“EOF”。(当然这块知识后续在详细讲解。)
这里就引出了一个案例:
int main(){
int ret=0;
char password[20]={0};//password指密码,用数组来接受所输入的值;所以这里“0”不确定是多少。
printf("请输入密码:>");
scanf("%s",password); //%s——字符
printf("请确认(Y/N):>");
ret=getchar();//接受‘Y’与‘N’
if(ret=='Y'){
printf("确认成功\n");
}
else{
printf("放弃确认\n");
}
return 0;
}
打印结果为:1 2 3 4 5 6
请确认(Y/N):>放弃确认
(这里123456指字符)
为何会出现这样的结果?
因为在输入密码123456后,按了回车键,而这操作被误认在键盘输入字符了。
回车键被getchar读取;在监视窗口下——可以看到这对应数值为10,说明ret里面放了“10”。
举例——
int main(){
printf("%d\n",'\n');
return 0;
}
这指打印出转义字符“\n” ,输出结果为十进制10
说明转义字符“\n”在ASCII码表中对应的就是十进制10.
这里还要在明白一个知识点:
工作原理:scanf要读一个字符串的话;首先要去检测一个地方——输入缓冲区。
输入缓冲区用来存放写数据,输入函数在接受数据的时候,会去看输入缓冲区有没有东西。
第一次去读的时候,输入缓冲区什么都没有;程序刚跑起来,在没有情况下,scanf等待你要输入的东西,一旦输入进去,缓冲区就有东西了;scanf函数就可以拿去缓冲区里想要的一部分,拿走之后,函数就过去了,之后getchar也会一样去看输入缓冲区是否有东西,没有就等待。
因为在键盘上输入123456+回车;这时,输入缓冲区就有了“123456\n”;但scanf函数在读这个字符串的时候,读密码的时候,是只把123456给读走了。
因为“\n”不是输入的密码,只是让scanf去读取,但不会拿走。
而当“123456”被读走后,缓冲区只剩下一个“\n”;这时代码再往下走,来到getchar去读取,因缓冲区有“\n”,就把“\n”读走了。
拿到想要的东西后,就便不再等待,而是放到ret里面去,又因ret=\n不等于Y,就执行else语句。
(以上就是打印结果的原因。(问题所在))
解决方案:
将以上代码执行逻辑给纠正过来。
思路:清空输入缓冲区的内容(getchar读取时能等待)——读取一下‘\n’(读走)
方法:再加一个getchar();即可
再换思路:若把密码更改为123456 (空格)ABCD
这时scanf函数只会读取输入缓冲区(空格前的数);getchar();读取空格,然ret=getchar();读取ABCD\nY,就又会出现之前的问题。
这时会发现只有一个getchar是不行的。
思路:可以让getchar();多读几个字符,即加上while循环。
写成——
while( (ch=getchar())!='\n') ){
;
}
代码2:
#include<stdio.h>
int main(){
int ch=0;
while( (ch=getchar() )!=EOF ){
if(ch<'0'||ch>'9') //只打印字符0到字符9的数字字符
continue;
putchar(ch);
}
returnv 0;
}
只会输出数字字符,其他字符不会输出。(ASCII码表)
这里“||”操作符是“或”的意思。
if(ch<'0'||ch>'9') ——表示若ch小于字符0或大于字符9,就跳走了,满足其一即可。