目录
基本结构
while(表达式)
{循环语句;}
#define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> int main() { while (1) { printf("循环语句"); } return 0; }代码运行结果:循环语句循环语句循环语句……
因为没有终止命令,会一直打印下去
while中的break
- 加了break后的运行结果只打印一次循环语句
int main() { while (1) { printf("循环语句"); break; } return 0; }- 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
运行结果为:#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; }- continue作用是跳过本次循环continue后面的代码,直接到while循环的判断部分,可以用F10逐句运行,打开监视器,观察运行情况,可以看出语句在判断和continue语句之间反复运行
- 使用场景:在某一次中不想继续处理了,直接进入下一次循环过程的场景
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和空语句清空输入缓存区。
好难好难😢慢慢理解
希望大家多多批评指正!

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


可以验证continue语句的作用
运行时发现缺少确认的一步
548

被折叠的 条评论
为什么被折叠?



