循环结构
循环结构:
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即可。