- 循环语句
•while
•for
•do while
- while循环语法结构
//while 语法结构
while(表达式)
循环语句;
表达式结果为真,循环语句执行,否则循环停止
eg:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main(void)
{
int i = 0; //初始化
while (i <10) //判断部分 当xxx时
{ i++; //循环变量的调整部分
printf("%d\n", i);
}
return 0;
}
- while 循环中 break的作用
在while循环中,break 用于永久的终止循环
//break的作用
#include<stdio.h>
int 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
#include<stdio.h>
int main(void)
{
int i = 1;
while (i <= 10)
{
if (i == 5)
continue;
printf("%d ", i); //打印:1 2 3 4 之后不执行后面的代码,进入死循环了
i++;
}
return 0;
}
continue在while循环中的作用就是:
continue是用于终止本次循环的,也就是本次循环中continue后边的代码不会再执行,而是直接跳转到while语句的判断部分,进行下一次循环的入口判断。
- 分析代码
4.1 getchar()
getchar():获取一个字符,返回的是int类型,返回的是获取的字符的ASKII码值或者是EOF(-1)
EOF:end of file,文件结束标志
#include<stdio.h>
int main(void)
{
int ch = getchar();
printf("%c\n", ch); //输入什么字符,就会输出什么字符
return 0;
}
4.2 putchar()
putchar():输出一个字符
//putchar():输出一个字符
#include<stdio.h>
int main(void)
{
int ch = getchar();
putchar(ch); //输出一个字符,ch是什么字符,就输出什么字符
return 0;
}
4.3 实践及巩固
getcahr 和 scanf 等输入函数是去缓冲区拿数据,如果发现缓冲区没有数据,等待键盘输入信息,若缓冲区有东西,则拿走。
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int 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;
}
//结果还没有确认密码(Y/N)就已经显示确认失败,为什么?
//① scanf到缓冲区获取信息,发现没有信息,等待键盘输入信息
//②键盘输入字符串123456,因为回车确认的缘故,系统中得到123456\n
//③scanf发现缓冲区有123456\n后,将123456赋给password,此时缓冲区只剩下\n
//④getchar也去缓冲区获取信息,发现\n,于是ch得到\n
//⑤ch为\n不为Y,打印确认失败
清理缓冲区以实现此功能
//怎么成功实现?-------清理缓冲区
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main(void)
{
char password[20] = { 0 };
printf("请输入密码:");
scanf("%s", password); //此处输入:123456,系统实际是:123456\n
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。
需要清理缓冲区中多个字符
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int 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
#include<stdio.h>
int main(void)
{
int ch = 0;
while ((ch = getchar()) != EOF)
{
if (ch < '0' || ch > '9') // ||:或 由ASCII表可知 该范围为非数字字符 continue 不打印 若为数字 打印
continue;
putchar(ch);
}
return 0;
}