史上最强C语言教程----分支和循环(3)

前言

对于一个C语言菜鸟来说,说出这些话无疑是大言不惭的,但我有信心也有能力为大家讲好C语言,系统的带大家入门C语言,也希望大家能够相信我,支持我,在接下来的几个月中,我会持续更新这个系列,当然,我的笔记也会同步更新的,感谢大家的支持!如果觉得内容还不错的话,点一个小小的赞和支持吧!

大家学了上节课的while()循环,相信大家已经对其有了一些基本的认识,并且已经掌握了其基本的语法,希望大家平时能够多加练习,这样才能更好的掌握其具体的使用,接下来给大家展示两段有关于while的代码,大家一起来看看吧!

//代码什么意思?
//代码1
#include <stdio.h>
int main()
{
 int ch = 0;
 while ((ch = getchar()) != EOF)
       putchar(ch);
    return 0;
}
//这里的代码适当的修改是可以用来清理缓冲区的.
//代码2
#include <stdio.h>
int main()
{
    char ch = '\0';
 while ((ch = getchar()) != EOF)
 {
     if (ch < ‘0’ || ch > ‘9’)
        continue;
     putchar(ch);
 }
 return 0;
}
//这个代码的作用是:只打印数字字符,跳过其他字符的、

首先带大家了解一下第一段代码,在了解之前,先带大家认识一下getchar()函数吧!

getchar的作用:

从一个流里读取一个字符,或者从标准输入(键盘)里面获取一个字符。

getchar的返回类型:

getchar的返回类型为int,返回的值就是我们从流或者键盘获取的那个字符。在这个地方我们就应该思考一下,为什么我们用int 来接收getchar返回的值呢?当我们讲一个字符用getchar输入的时候,我们就要将其存储到相应的变量当中(当然,不存储也是完全没有任何问题的),我们在讲我们的字符存入到变量当中时,本质上是将字符的ascii码值存入到变量所开辟的内存空间中,例如字符'a'的ascii码值就是97,当我们将其存储时,就是将其ascii码值转换为二进制,存放到我们变量所开辟的空间中,这是其中的一个原因;另一个原因就是如果getchar 在遇到读取错误或者EOF(end of file文件结束标志)时,getchar()会返回一个EOF,那么EOF究竟是什么呢?它有没有具体的值呢?让我们去它的定义看一下吧!

相信大家看到了EOF的定义了吧,那么他的返回值-1跟计算机定义它的返回类型为整型有什么关系呢?-1是整型数据,在内存中占据四个字节,如果是其它的类型比如char只有一个字节怎么能够放得下呢?综合上面这两点考虑,C语言程序设计者最终采用了int作为getchar()的返回类型。

getchar的用法:

在这个地方大家需要注意,当我们输入字符s之后,我们要敲回车键输入才会停止,然后才会执行printf()语句进行输出,将字符s真正输出出来,在上述代码框中,大家可以看到有两个字符s,这里呢,需要给大家解释一下,前面的字符s是我们输入的字符,后面的一个字符是执行printf()语句后输出的语句,这个点希望大家能够清楚。

这个时候有的同学就问了,难道输出字符只能用prinf进行输出吗?难道没有一个函数与getchar进行对应吗?答案是有的,那个函数就是putchar,在这呢,简单给大家简单介绍一下putchar()。

putchar的作用:

写一个字符到流里面或者到标准输出(显示器)中。

putchar的用法:

在这个地方需要大家注意,getchar和putchar不仅仅是只能输出一个字符,我们通常会将字符给狭义化的认为字符只是a~z和A~Z,但事实上,getchar和putchar不仅仅是只能输出这些,还能输出数和一些其它符号,比如#、@等等。给大家代码展示一下吧!

 这个地方呢,无论我们输入什么,getchar只会将其当作一个字符来处理,然后将其转换成相应的ascii码值,然后转成二进制数据,存入到变量所开辟的空间中!即使我们输入多个字符,getchar也只会将接收到的首个字符将其存入到变量开辟的内存空间中。下面进行代码展示!

 从这个地方可以看出,我们输入了1234四个字符。这个地方希望大家一定要注意,我们输入的是4个字符,而不是1234一个数字,这个地方希望大家一定要明白,getchar读取和putchar输出都是以字符为单位进行的,接下来大家请看下一段代码!

 看到这段代码,我想先告诉大家这种情况下我们该如何停止!相信这也是大家最疑惑的问题,一般大家只直到强制结束程序进而退出,但其实这种情况下是可以退出的,我们只需要按键盘上的ctrl+z键然后敲击回车键即可,这样程序即可正常退出!我们输入的这个也即是文件结束标志EOF。

很多同学就问了,写这段代码有什么意义呢?来。大家跟着我看这样一个场景!

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

相信大家看到这会有一个疑问,scanf后面的input为什么没有取地址呢?这个地方需要给大家强调一下,数组名本身就是地址,所以scanf后面就不需要取地址了!看到这个地方,相信大家也懂了我们为什么会给大家讲这段代码了,因为这段代码在某些场景下确实会用到。

那么这段代码究竟能否完成我们想要表达的意思呢?我们代码运行一下就知道了!

哎,很明显,这段代码并不能完成我们想要它达成的目标,为什么呢?接下来会给大家讲解!

现在给大家引入一个输入缓冲区的概念,getchar读取字符的时候,它并不是直接就从键盘上进行读取的,它首先要看一看输入缓冲区中是否有数据,如果没有,才会从键盘上进行读取数据, 当我们在上面这个程序中输入密码结束后,我们会在键盘上敲击一个回车进行换行,这也标志着我们的输入结束,这个回车本身并没有被放入到我们输入的字符串中去,而是被放入到了输入缓冲区中去,当getchar进行读取字符时,首先看输入缓冲区,发现输入缓冲区并不为空,然后就将输入缓冲区中的回车字符读取了,存入到了变量ch中,进而判定后不等于字符Y,所以会输出“确认失败!”,下面给大家简单画图展示一下!

 当然scanf也有类似的特性,希望大家了解这个,其实大家如果了解了这个原理,相应的对于上面的解决方法也就显而易见了,下面给大家代码展示!

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

代码执行过后,果然没问题了,解决的方法很简单,就是在getchar()确认密码前用一个getchar()将输入缓冲区的回车键吸收即可!这个地方的getchar吸收的数据,可以保存,也可以不保存!

但这个地方呢,还是会有问题,接下来我们输入一段代码,测试一下刚才我们修改后的程序!

 这个地方程序又又又出错了,这次究竟是什么原因呢?首先是scanf函数,先查看输入缓冲区中有没有数据,没有,然后从键盘上进行输入,在这个地方大家需要注意的是,scanf函数在接受输入时遇到空格就会停止,然后后面的jshfkj\n均留在了输入缓冲区,所以getchar在接收数据的时候,将第一个j存入到变量ch中,判定并不等于'Y',所以会输出确认失败。那么,我们该如何解决呢?

大家可以自己想一下,我们在进行输入的时候,最后输入的是空格符,即'\n',那么我们在吸收的时候可以加一个判定啊,就是通过while()对缓冲区的字符进行逐个判定,只要不是'\n',那么我们就通过getchar将缓冲区的数据全部吸收,下面大家来看解决方式!

include<stdio.h>
int main()
{
	char input[20] = { 0 };
	printf("请输入密码:");
	scanf("%s", input);//scanf在将数据存入变量时,遇到空格就停止,但输入并未停止,输入的其它数据会\
	存入到输入缓冲区中去,就是说,如果输入了abcde hehe,只有前面的数据abcde被scanf吸收了,输入缓冲区中\
	仍然有hehe\n
	printf("请确认密码:Y/N:");
	int tmp = 0;
	while ((tmp = getchar()) != '\n')//这个地方是针对输入密码时输入abcde hehe\n\
		最后的\n也会被拿走
	{
		;//空语句,什么也不干
	}
	int ch = getchar("%c");
	if ( 'Y'==ch)
	{
		printf("确认成功!");
	}
	else
	{
		printf("确认失败!");
	}
	return 0;
}

看到这个地方。相信大家对第一段代码应该是有自己的深刻的理解了吧,这看上去知识一段简单的代码,但当我们深入的进行了解之后,发现并没有我们想象的那么简单,所以希望大家今后能够多加思考!

接下来大家来看第二段代码!第二段代码并不复杂,就是首先定义的一个字符变量ch,并对其进行初始化为'\0',然后一个while()语句对每个输入的字符进行判断,如果是0到9的数字,就输出。如果不是,就运行continue语句重新进行输入,如果想要结束输入就在键盘上输入ctrl+z即可,总结来说,这段代码就是在键盘上接收并在显示器上输出0~9的数字。

  • 30
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 10
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鹿九丸

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值