栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C语言 循环结构 —— while循环

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C语言 循环结构 —— while循环

while循环
//while 语法结构
	while (表达式)  
		循环语句:

表达式结果为真,为非0的时候,循环语句执行,否则循环停止

举例:打印整数1-10

#include
int main(void)
{                     
	int i = 1;        //初始化
	while (i <= 10)   //判断部分
	{
		printf("%dn", i);
		i++;          //循环变量的调整部分
	}
	return 0;
}

在while循环中,break 用于永久的终止循环,举例:

#include
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 会怎样?

在while循环中,continue是用于终止本次循环的,也就是本次循环中continue后面的代码不会再执行,而是直接跳转到while语句的判断部分。进行下一次循环的入口判断。

#include
int 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,文件结束标志

#include
int main(void)
{
    int ch = getchar();
	printf("%cn", ch);  //输入什么字符,则输出什么字符
	return 0;
}

putchar():输出一个字符

#include
int main(void)
{
	int ch = getchar();
	putchar(ch);   //输出一个字符,ch是什么字符,就输出什么字符
	return 0;
}

 思考:1,下面这种while循环现实生活中有什么意义?

#include
int 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
#include
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;
}

 输出结果:还没有确认密码,就直接显示确认失败了,为什么?

分析:

getchar  scanf 等输入函数,它们是取哪里获取信息的?是从键盘直接拿到的信息吗?

它们是从中间的缓冲区拿去的,它们过来的时候发现缓冲区没有数据,就会等待,从键盘输一些信息进去。如果发现缓冲区有信息了,它们就会拿走。

上面的结果是错的,那怎么解决呢?

当scanf 过来缓冲区把 123456拿走后,getchar过来看到缓冲区有 n,所以把 n 拿走了。

如果我们把 n 清除掉,那缓冲区就没有信息了,getchar就会乖乖第等在这让我们输入Y或者N。

那我们怎么做呢?—— 清理缓冲区

#define _CRT_SECURE_NO_WARNINGS 1
#include
int 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
#include
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
int main(void)
{
	int ch = 0;
	while ((ch = getchar()) != EOF)
	{
		if (ch < '0' || ch > '9')    // ||:或
			continue;

		putchar(ch);
	}
	return 0;
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1033369.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号