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

 更新时间:2022年06月13日 15:51:33   作者:要努力丫!  
在不少实际问题中有许多具有规律性的重复操作,因此在程序中就需要重复执行某些语句。一组被重复执行的语句称之为循环体,C语言while语句可以是单个语句,也可以是一个语句块,其条件可以是任意表达式,true是任意非零值,当条件为真时,循环进行迭代

在学习和回顾该知识前,已经掌握了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

来测试一下在代码中分别加入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看看,发现运行结果为:

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

2、代码示例

示例一:

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

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

运行结果如下:

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

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和键盘之间有一个缓冲区,键入字符“A”就相当于将“A\n”放进了缓冲区里面。

示例二:

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

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,就提示确认失败了。这是为甚呢?因为我们在键盘上键入“2022”之后,还会键入一个回车,此时放到缓冲区就放的是“2022\n”。

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

如何修正程序呢?

将执行scanf之后的缓冲区里面的“\n”拿走,也就是将缓冲区清理干净,这样的话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
确认成功

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

比如密码是“2022 abc”,执行结果如下:

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

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

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)这句话,所以这段代码最终只会打印输入的数字,想要终止运行,键入“ctrl+z”即可。代码运行结果如下:

1
1
3
3
9
9
^Z

到此这篇关于C语言示例讲解while循环语句的用法的文章就介绍到这了,更多相关C语言while循环内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 使用C++17实现JSON库设计思路示例全解

    使用C++17实现JSON库设计思路示例全解

    这篇文章主要为大家介绍了使用C++17实现JSON库设计思路示例全解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08
  • c++读取和写入TXT文件的整理方法

    c++读取和写入TXT文件的整理方法

    今天小编就为大家分享一篇c++读取和写入TXT文件的整理方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-07-07
  • c++ 封装一个截图服务

    c++ 封装一个截图服务

    这篇文章主要介绍了c++ 封装一个截图服务的方法,帮助大家更好的理解和使用c++,感兴趣的朋友可以了解下
    2021-01-01
  • C语言实现高精度减法

    C语言实现高精度减法

    高精度的本质是将数字以字符串的形式读入,然后将每一位分别存放入int数组中,通过模拟每一位的运算过程,来实现最终的运算效果,下面我们就来看看C语言如何实现高精度减法吧
    2023-11-11
  • string,CString,char*之间的转化

    string,CString,char*之间的转化

    下面是MFC/C++/C中字符类型CString, int, string, char*之间的转换的说明与举例,经常用的东西,相信对于用C/C++的朋友,还是比较有用的
    2013-03-03
  • 深入解析C语言中常数的数据类型

    深入解析C语言中常数的数据类型

    C语言中常数的数据类型,需要的朋友可以过来参考下。希望对大家有所帮助
    2013-10-10
  • VC6.0常用快捷键大全

    VC6.0常用快捷键大全

    这篇文章主要介绍了VC6.0常用快捷键大全,非常实用,需要的朋友可以参考下
    2014-08-08
  • 详解C++编程中类模板的相关使用知识

    详解C++编程中类模板的相关使用知识

    这篇文章主要介绍了详解C++编程中类模板的相关使用知识,包括函数的参数类型替换等方法,需要的朋友可以参考下
    2015-09-09
  • C++11/14 线程调用类对象和线程传参的方法

    C++11/14 线程调用类对象和线程传参的方法

    这篇文章主要介绍了C++11/14 线程调用类对象和线程传参的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-01-01
  • C++实现控制台版扫雷程序

    C++实现控制台版扫雷程序

    这篇文章主要为大家详细介绍了C++实现控制台版扫雷程序,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-05-05

最新评论