//while 语法结构 while (表达式) 循环语句:
表达式结果为真,为非0的时候,循环语句执行,否则循环停止
举例:打印整数1-10
#includeint main(void) { int i = 1; //初始化 while (i <= 10) //判断部分 { printf("%dn", i); i++; //循环变量的调整部分 } return 0; }
在while循环中,break 用于永久的终止循环,举例:
#includeint main(void) { int i = 1; while (i <= 10) { if (i == 5) break; printf("%d ", i); //只会输出:1 2 3 4 ,到5的时候就终止循环了 i++; } return 0; }
把上面的 break 换成 continue 会怎样?
在while循环中,continue是用于终止本次循环的,也就是本次循环中continue后面的代码不会再执行,而是直接跳转到while语句的判断部分。进行下一次循环的入口判断。
#includeint main(void) { int i = 1; while (i <= 10) { if (i == 5) continue5; printf("%d ", i); //打印:1 2 3 4 之后不执行后面的代码,进入死循环了 i++; } return 0; }
分析下面代码:
getchar():获取一个字符,返回的是int类型,返回的是获取的字符的ASKII码值或者是EOF(-1)
EOF:end of file,文件结束标志
#includeint main(void) { int ch = getchar(); printf("%cn", ch); //输入什么字符,则输出什么字符 return 0; }
putchar():输出一个字符
#includeint main(void) { int ch = getchar(); putchar(ch); //输出一个字符,ch是什么字符,就输出什么字符 return 0; }
思考:1,下面这种while循环现实生活中有什么意义?
#includeint main(void) { int ch = 0; //ctrl + z: getchar 读取结束,相当于getchar读到了一个EOF while ((ch = getchar()) != EOF) { putchar(ch); } return 0; }
2,下面这个函数会输出什么,为什么?
#define _CRT_SECURE_NO_WARNINGS 1 #includeint main(void) { char password[20] = { 0 }; printf("请输入密码:>"); scanf("%s", password); //password数组名本来就是个地址,所以前面不用加& printf("请确认密码(Y/N):>"); int ch = getchar(); if (ch == 'Y') { printf("确认成功n"); } else { printf("确认失败n"); } return 0; }
输出结果:还没有确认密码,就直接显示确认失败了,为什么?
分析:
getchar scanf 等输入函数,它们是取哪里获取信息的?是从键盘直接拿到的信息吗?
它们是从中间的缓冲区拿去的,它们过来的时候发现缓冲区没有数据,就会等待,从键盘输一些信息进去。如果发现缓冲区有信息了,它们就会拿走。
上面的结果是错的,那怎么解决呢?
当scanf 过来缓冲区把 123456拿走后,getchar过来看到缓冲区有 n,所以把 n 拿走了。
如果我们把 n 清除掉,那缓冲区就没有信息了,getchar就会乖乖第等在这让我们输入Y或者N。
那我们怎么做呢?—— 清理缓冲区
#define _CRT_SECURE_NO_WARNINGS 1 #includeint main(void) { char password[20] = { 0 }; printf("请输入密码:>"); scanf("%s", password); //此处输入:123456,系统实际是:123456n printf("请确认密码(Y/N):>"); //清理缓冲区 getchar(); //处理'n', 只是读,没有放到变量里去 int ch = getchar(); //这个getchar去缓冲区的时候,缓冲区就没东西了 if (ch == 'Y') { printf("确认成功n"); } else { printf("确认失败n"); } return 0; }
结果:
但是如果上面 scanf("%s", password) 输入的是123456 abc, 结果又会出错,因为scanf只读取空格之前的信息(如果输入的密码本身就需要有空格,可用gets()读取整行),后面的字符一个getchar 读不完,需要很多个getchar,又因为输入的字符个数是随机的,所以不确定要写几个getchar。
这个时候用个while循环就好办了:
#define _CRT_SECURE_NO_WARNINGS 1 #includeint main(void) { char password[20] = { 0 }; printf("请输入密码:>"); scanf("%s", password); printf("请确认密码(Y/N):>"); //清理缓冲区中的多个字符 int temp = 0; while ((temp = getchar()) != 'n') { ; } int ch = getchar(); if (ch == 'Y') { printf("确认成功n"); } else { printf("确认失败n"); } return 0; }
#define _CRT_SECURE_NO_WARNINGS 1 #includeint main(void) { int ch = 0; while ((ch = getchar()) != EOF) { if (ch < '0' || ch > '9') // ||:或 continue; putchar(ch); } return 0; }



