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

x33g5p2x  于2021-11-19 转载在 其他  
字(4.2k)|赞(0)|评价(0)|浏览(334)

前言

对于一个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的数字。

相关文章

微信公众号

最新文章

更多