草庐IT

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

食人的小草 2023-12-23 原文

while循环

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

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

举例:打印整数1-10

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

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

#include<stdio.h>
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<stdio.h>
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<stdio.h>
int main(void)
{
    int ch = getchar();
	printf("%c\n", ch);  //输入什么字符,则输出什么字符
	return 0;
}

putchar():输出一个字符

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

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

#include<stdio.h>
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<stdio.h>
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<stdio.h>
int main(void)
{
	char password[20] = { 0 };
	printf("请输入密码:>");
	scanf("%s", password);  //此处输入:123456,系统实际是:123456\n
	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<stdio.h>
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<stdio.h>
int main(void)
{
	int ch = 0;
	while ((ch = getchar()) != EOF)
	{
		if (ch < '0' || ch > '9')    // ||:或
			continue;

		putchar(ch);
	}
	return 0;
}

有关C语言 循环结构 —— while循环的更多相关文章

  1. ruby - 使用 ruby​​ 将 HTML 转换为纯文本并维护结构/格式 - 2

    我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h

  2. ruby - 树顶语法无限循环 - 2

    我脑子里浮现出一些关于一种新编程语言的想法,所以我想我会尝试实现它。一位friend建议我尝试使用Treetop(Rubygem)来创建一个解析器。Treetop的文档很少,我以前从未做过这种事情。我的解析器表现得好像有一个无限循环,但没有堆栈跟踪;事实证明很难追踪到。有人可以指出入门级解析/AST指南的方向吗?我真的需要一些列出规则、常见用法等的东西来使用像Treetop这样的工具。我的语法分析器在GitHub上,以防有人希望帮助我改进它。class{initialize=lambda(name){receiver.name=name}greet=lambda{IO.puts("He

  3. ruby-on-rails - 在 Ruby 中循环遍历多个数组 - 2

    我有多个ActiveRecord子类Item的实例数组,我需要根据最早的事件循环打印。在这种情况下,我需要打印付款和维护日期,如下所示:ItemAmaintenancerequiredin5daysItemBpaymentrequiredin6daysItemApaymentrequiredin7daysItemBmaintenancerequiredin8days我目前有两个查询,用于查找maintenance和payment项目(非排他性查询),并输出如下内容:paymentrequiredin...maintenancerequiredin...有什么方法可以改善上述(丑陋的)代

  4. ruby - 如何将脚本文件的末尾读取为数据文件(Perl 或任何其他语言) - 2

    我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚

  5. ruby - RuntimeError(自动加载常量 Apps 多线程时检测到循环依赖 - 2

    我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("

  6. ruby - 寻找通过阅读代码确定编程语言的ruby gem? - 2

    几个月前,我读了一篇关于ruby​​gem的博客文章,它可以通过阅读代码本身来确定编程语言。对于我的生活,我不记得博客或gem的名称。谷歌搜索“ruby编程语言猜测”及其变体也无济于事。有人碰巧知道相关gem的名称吗? 最佳答案 是这个吗:http://github.com/chrislo/sourceclassifier/tree/master 关于ruby-寻找通过阅读代码确定编程语言的rubygem?,我们在StackOverflow上找到一个类似的问题:

  7. ruby - 是否有用于序列化和反序列化各种格式的对象层次结构的模式? - 2

    给定一个复杂的对象层次结构,幸运的是它不包含循环引用,我如何实现支持各种格式的序列化?我不是来讨论实际实现的。相反,我正在寻找可能会派上用场的设计模式提示。更准确地说:我正在使用Ruby,我想解析XML和JSON数据以构建复杂的对象层次结构。此外,应该可以将该层次结构序列化为JSON、XML和可能的HTML。我可以为此使用Builder模式吗?在任何提到的情况下,我都有某种结构化数据-无论是在内存中还是文本中-我想用它来构建其他东西。我认为将序列化逻辑与实际业务逻辑分开会很好,这样我以后就可以轻松支持多种XML格式。 最佳答案 我最

  8. Unity 热更新技术 | (三) Lua语言基本介绍及下载安装 - 2

    ?博客主页:https://xiaoy.blog.csdn.net?本文由呆呆敲代码的小Y原创,首发于CSDN??学习专栏推荐:Unity系统学习专栏?游戏制作专栏推荐:游戏制作?Unity实战100例专栏推荐:Unity实战100例教程?欢迎点赞?收藏⭐留言?如有错误敬请指正!?未来很长,值得我们全力奔赴更美好的生活✨------------------❤️分割线❤️-------------------------

  9. 7个大一C语言必学的程序 / C语言经典代码大全 - 2

    嗨~大家好,这里是可莉!今天给大家带来的是7个C语言的经典基础代码~那一起往下看下去把【程序一】打印100到200之间的素数#includeintmain(){ inti; for(i=100;i 【程序二】输出乘法口诀表#includeintmain(){inti;for(i=1;i 【程序三】判断1000年---2000年之间的闰年#includeintmain(){intyear;for(year=1000;year 【程序四】给定两个整形变量的值,将两个值的内容进行交换。这里提供两种方法来进行交换,第一种为创建临时变量来进行交换,第二种是不创建临时变量而直接进行交换。1.创建临时变量来

  10. Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting - 2

    1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里

随机推荐