C语言示例讲解while循环语句的用法

作者:要努力丫! 时间:2023-09-13 01:44:40 

在学习和回顾该知识前,已经掌握了if语句的结构和用法。

if (条件)
    语句;

当条件满足的情况下,if结构中的语句执行,且只执行一次;条件不满足则不执行。但是生活中常常需要将一件事情完成很多次,这时候就要用到while语句来实现循环了。

1、while语句结构

while (表达式)
    循环语句;

例子:利用循环结构打印1-10

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

 1 2 3 4 5 6 7 8 9 10

C语言示例讲解while循环语句的用法

来测试一下在代码中分别加入continue和break是什么结果

在while循环中,break用于永久地终止循环

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

运行结果为:

1 2 3 4

将break改为continue看看,发现运行结果为:

C语言示例讲解while循环语句的用法

输出4之后,光标持续闪烁,因为在while循环中,continue的作用是跳过本次循环continue后面的代码(这样就跳过了printf("%d ", i);i++; 这两条语句),直接程序又去到判断部分,看是否进行下一次循环。

2、代码示例

示例一:

看一下下面这段代码是什么意思

int main()
{
int ch = 0;
while ((ch = getchar()) != EOF)
putchar(ch);
return 0;
}

运行结果如下:

输入什么字母就会输出什么字母,想要退出该程序的运行,就使用快捷键&ldquo;ctrl + z&rdquo;。

a
a
A
A
^Z

getchar这个是指如果读取成功的话,返回的是ASCII码值,若读取失败,则返回的是EOF(end of file),是文件结束标志。

测试getchar的功能

int main()
{
int ch = getchar();
printf("%c\n",ch);
//putchar(ch);//这条语句与上一条语句一样的意思
return 0;
}

运行该测试代码,在打印结果的窗口,键入一个A字符回车,就会打印出A字符。(putchar是指输出一个字符)

在getchar和键盘之间有一个缓冲区,键入字符&ldquo;A&rdquo;就相当于将&ldquo;A\n&rdquo;放进了缓冲区里面。

C语言示例讲解while循环语句的用法

示例二:

假设输入一段字符作为密码,将该密码存放到字符串passwd里面,然后弹出一个&ldquo;请确认密码&rdquo;的提示,如果确认密码正确就键入&ldquo;Y&rdquo;,输出&ldquo;确认成功&rdquo;;否则键入&ldquo;N&rdquo;,输出&ldquo;确认失败&rdquo;。编写的代码如下:

int main()
{
char passwd[20] = { 0 };
printf("请输入密码:>");
scanf("%s",passwd);//假设输入的密码是2022
//这里passwd不取地址的原因是passwd是个数组,数组的数组名本身就是个地址,所以
//此处没有给passwd加上取地址符
printf("请确认密码(Y/N):>");
int ch = getchar();
if (ch == 'Y')
{
printf("确认成功\n");
}
else
{
printf("确认失败\n");
}
return 0;
}

运行该代码的结果如下:

请输入密码:>2022
请确认密码(Y/N):>确认失败

显然,该代码是存在错误的。还没等输入Y/N,就提示确认失败了。这是为甚呢?因为我们在键盘上键入&ldquo;2022&rdquo;之后,还会键入一个回车,此时放到缓冲区就放的是&ldquo;2022\n&rdquo;。

而scanf与getchar是输入函数,它们不是直接从键盘上拿数据,而是从中间的缓冲区去拿数据,如果缓冲区没有数据,它就会等待从键盘上输入一点信息到缓冲区里面去。scanf只会将缓冲区里面的&ldquo;2022\n&rdquo;里的&ldquo;2022&rdquo;拿走,缓冲区里面还剩下&ldquo;\n&rdquo;;getchar在读取的时候,就没有作等待动作,直接将缓冲区里面的&ldquo;\n&rdquo;拿走了,所以还么等我们输入Y/N,就已经打印了&ldquo;确认失败&rdquo;。

如何修正程序呢?

将执行scanf之后的缓冲区里面的&ldquo;\n&rdquo;拿走,也就是将缓冲区清理干净,这样的话getchar函数就得等待输入,就可以正确运行了。

代码如下:

int main()
{
char passwd[20] = { 0 };
printf("请输入密码:>");
scanf("%s",passwd);//假设输入的密码是2022
printf("请确认密码(Y/N):>");
//清理缓冲区
getchar();//处理'\n'
int ch = getchar();
if (ch == 'Y')
{
printf("确认成功\n");
}
else
{
printf("确认失败\n");
}
return 0;
}

运行结果为:

请输入密码:>2022
请确认密码(Y/N):>Y
确认成功

这时候对于连续的密码输入来说是正确运行的,那么对于不连续(中间有空格)的呢?

比如密码是&ldquo;2022 abc&rdquo;,执行结果如下:

请输入密码:>2022 abc
请确认密码(Y/N):>确认失败

可以看出,程序还是存在纰漏。那么怎么处理呢?这就要将缓冲区里面的多个字符都给清理干净。此时只一个getchar函数处理不掉空格以及&ldquo;\n&rdquo;了,可以使用while循环,让它一直读取,直到将&ldquo;\n&rdquo;都读走。

int main()
{
char passwd[20] = { 0 };
printf("请输入密码:>");
scanf("%s",passwd);//假设输入的密码是2022
printf("请确认密码(Y/N):>");
清理缓冲区
//getchar();//处理'\n'
//清理缓冲区中的多个字符
int tmp = 0;
while ((tmp = getchar()) != '\n')
{
;
}
int ch = getchar();
if (ch == 'Y')
{
printf("确认成功\n");
}
else
{
printf("确认失败\n");
}
return 0;
}

请输入密码:>2022 abc
请确认密码(Y/N):>Y
确认成功

示例三:

//只会打印数字
int main()
{
int ch;
while ((ch = getchar()) != EOF)
{
if (ch < '0' || ch > '9')
continue;
putchar(ch);
}
return 0;
}

根据ASCII码值,我们可以知道该段代码的意思是:如果不是数字就continue,执行continue会跳过putchar(ch)这句话,所以这段代码最终只会打印输入的数字,想要终止运行,键入&ldquo;ctrl+z&rdquo;即可。代码运行结果如下:

1
1
3
3
9
9
^Z

来源:https://blog.csdn.net/qq_42822743/article/details/125179644

标签:C语言,while,循环
0
投稿

猜你喜欢

  • 解决Android ListView数据为空及加载错误的方法

    2022-11-30 06:57:41
  • Java Excel透视表相关操作实现代码

    2022-02-27 00:11:01
  • Java判断ip是否为IPV4或IPV6地址的多种方式

    2023-03-28 01:18:31
  • Spring框架中@PostConstruct注解详解

    2021-09-20 09:35:58
  • Android 消息队列模型详解及实例

    2023-04-06 10:49:43
  • JVM常用垃圾收集器详细解说

    2023-02-15 02:19:49
  • Android studio4.1更新后出现的问题详解

    2022-12-06 03:22:54
  • Kotlin启动协程的三种方式示例详解

    2023-06-07 02:58:53
  • 浅谈java多态的实现主要体现在哪些方面

    2023-08-17 07:41:32
  • IntellJ IDEA神器使用技巧(小结)

    2023-08-08 22:01:44
  • C#适用于like语句的SQL格式化函数

    2022-11-01 22:49:31
  • Java实现经典游戏Flappy Bird的示例代码

    2022-03-28 07:05:37
  • java判断两个时间是不是同一天的方法

    2022-09-23 03:09:16
  • 在idea中使用JaCoCo插件统计单元测试覆盖率的实现

    2022-12-27 12:31:28
  • MyBatis Xml映射文件之字符串替换方式

    2022-03-23 00:06:39
  • C#多线程的相关操作讲解

    2022-01-13 18:32:12
  • Android studio点击跳转WebView详解

    2022-12-12 05:11:17
  • Mac OS下为Android Studio编译FFmpeg解码库的详细教程

    2023-06-30 02:37:54
  • C# 无边框窗体之窗体移动实现代码

    2021-07-22 04:36:48
  • android 设置圆角图片实现代码

    2023-11-29 15:00:29
  • asp之家 软件编程 m.aspxhome.com