循环结构 while循环

循环结构

循环结构:
while 语句
语法结构:

while (表达式)
循环语句:

一段代码举例,打印一到十的数字


#include<stdio.h>
int main()
{
	int i = 1;
	while (i <= 10)
	{

		printf("%d\n", i);
		i++;
	}
	return 0;
}

利用 while 循环结构可以轻松解决问题

发散一下,如果在 while 语句加上 break 关键字会怎么样呢?


#include<stdio.h>
int main()
{
	int i = 1;
	while (i <= 10)
	{
		if (5 == i)
			break;
		printf("%d\n", i);
		i++;
	}
	return 0;
}

可知数字打印到 4 就结束循环,代码执行过程中,
遇到 break 关键字就立刻跳出循环,结束运行。

那么接着思考,如果把关键字 break 换成 continue 会怎么样呢?


#include<stdio.h>
int main()
{
	int i = 1;
	while (i <= 10)
	{
		if (5 == i)
			continue;
		printf("%d\n", i);
		i++;
	}
	return 0;
}

我们会发现,结果打印到 4 时,打印过程并没有结束,而是陷入了死循环。
那我们接着调整 ,把 i++;放到关键字 continue 前面。



#include<stdio.h>
int main()
{
	int i = 0;
	while (i <= 10)
	{
	i++;	
	if (5 == i)
			continue;
		printf("%d\n", i);
		
	}
	return 0;
}

可知,数字仍会打印到 11,所以在关键字 continue 之前的语句都是可以继续执行的。
故,我们可以总结
关键字 continue 在 while 语句中的作用:

结束本次循环,即后面的语句不会执行,而是直接跳到 while 语句的判断部分,进行下一次循环入口的判断

新的关键字:getchar 与 putchar

getchar():获取字符
putchar():输出字符

这是对于字符类型的更为简便的编译方式

以代码举例:


#include<stdio.h>
int main()
{
	int ch = getchar();
	 putchar(ch);
	 printf("%c\n", ch);
	return 0;
}

输入一个“e”字样,打印结果会出现“ee”,正是由于 putchar 存在的原因
将它放入 while 语句中,如下:



#include<stdio.h>
int main()
{
	int ch = 0; 
	while ((ch = getchar()) != EOF)
	{
		putchar(ch);
	}
	return 0;
}

运行这段代码,我们可知,输入一个字符,便会对应输出一个同样的字符,只要我们输入的结果不是 EOF 字样的,这段代码便可以无休止地运行下去,但是,我们输入EOF字样的字符时,运行并没有结束,而是出现了同样的字符,所以,这里的EOF不是指输入EOF字样,而是要按下 Crtl+z的组合键,才可以终止循环。

解释 上面那段 while 代码有何价值:

#define _CRT_SECURE_NO_WARNINGS


#include<stdio.h>
int main()
{
	int ret = 0;
	char password[20] = { 0 };
	printf("请输入密码:>");
	scanf("%s", password);
	printf("请确认(Y/N);>");
	ret = getchar();
	if ('Y' == ret)
	{
		printf("确认成功\n");
	}
	else
	{
		printf("放弃确认\n");
	}
	return 0;
}

举这样一段代码为例,可知,当我们输入一个密码时,理论上会弹出让我们确认的选项,可我们运行时,结果却不同。
原因是为何呢? 其实当我们输入一串数字后,数字会存放在缓冲区中,而数字结尾有一个换行符 ‘\n’,表现为空格,他占用了 getchar 的读取位置,使其直接判断了后面的 if 语句。故我们要设计一个代码,来接收’\n’ 这个字符。

因此,我们做出以下调整


#include<stdio.h>
int main()
{
	int ret = 0;
	char password[20] = { 0 };
	printf("请输入密码:>");
	scanf("%s", password);
	printf("请确认(Y/N);>");
	getchar();
	ret = getchar();
	if ('Y' == ret)
	{
		printf("确认成功\n");
	}
	else
	{
		printf("放弃确认\n");
	}
	return 0;
}

我们在 ret = getchar();之前加入一个 getchar()函数接收多余的 ‘\n’ 使其不再对结果进行干扰,这样问题看似就解决了
而当我们输入“123456 abcd”时,我们运行程序,又发生了错误。这是为什么呢?
原来当我们输入“123456 abcd”时,在缓冲区的 123456 会被 scanf 函数 读取走,接着 getchar函数会读取空格’\n’ 然后,下面的 abcd 就会被 if 判断,
因此我们还要做出调整。


#include<stdio.h>
int main()
{
	int ret = 0;
	int ch = 0;
	char password[20] = { 0 };
	printf("请输入密码:>");
	scanf("%s", password);
	printf("请确认(Y/N);>");
	while ((ch = getchar()) != '\n')
	{
		;
	}
	ret = getchar();
	if ('Y' == ret)
	{
		printf("确认成功\n");
	}
	else
	{
		printf("放弃确认\n");
	}
	return 0;
}

这里我们就用到 while 语句,使其缓冲区多余的字符全部被接收走。这样问题就很完美的解决了。

下面还有另外一个例子,只打印字符0~9的字符


#include<stdio.h>
int main()
{
	int ch = 0;
	while ((ch = getchar()) != EOF)
	{
		if (ch<'0' || ch>'9')
			continue;
		putchar(ch);
	}
	return 0;
}

由代码可知,如果输入的值在字符 0~9 之外,那么便会执行 continue ,重新输入,如果属于 0~9 那么便打印出来。如果想要停止打印,按住 crtl+z即可。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值