getchar的用法讲解

目录

一、getchar的了解认识(什么是getchar)

二、通过代码演示getchar的用法

三、getchar正确使用的例子(密码的输入)


一、getchar的了解认识(什么是getchar)

        这里小编给大家推荐一个网站,叫做Cplusplus.com,这个网站是你用来查找C/C++中基本上所有的关键字或者一些头文件等等的相关知识。首先,我们进去之后,可以索引搜索getchar,看看它的用法。(如下图) 

getchar的用法讲解_第1张图片

        当我们搜索完getchar之后,我们会看他它的相关知识,比如功能、参数、返回值已经它的例子等相关内容,虽然是英文的,但是有什么不懂的单词,我们可以借助我们浏览器自带的翻译来帮助我们理解。

        通过上图我们可以看见关于getchar的功能,就是从缓冲区读取一个字符,它的返回值是int类型,也就是读取字符对应的ASCII码值,当然 ,如果读取失败则返回EOF(也就是-1),我们还可以看到它的参数是viod,也就是不需要参数。

二、通过代码演示getchar的用法

        

#include
int main()
{
	int ch = 0;
	while ((ch = getchar()) != EOF)
	{
		printf("%c\n", ch);
	}
	return 0;
}

        这里,我为大家解释一下上面的代码,也就是说,当我们getchar()读取字符成功后,会将该字符的ASCII码值返回出来,也就是赋给ch,当这样ch不等于EOF(EOF其实就是end of file,也就是文件结束标志,本质就是-1)时,进入循环,否则就不会进入循环,也就是说,只有当getchar()读取字符成功时,就会进去循环,把该字符打印在屏幕上,否则就不会打印。这里我给大家运行一下看一下它的结果。ru'shang'ru

getchar的用法讲解_第2张图片

         如上图,我们可以看见,我们输入一个字符后,当getchar读取成功后,进入循环,并且讲该字符打印在屏幕上。如果我们想结束它,我们可以摁住ctrl+z就可以结束程序。

        那么到这里,有些人就会有些疑惑,这个getchar在正常程序中到底是如何使用的呢,是在什么样的情况下使用的呢?下面,小编则用一个简单的例子来为大家演示一下这个getchar在日常的程序中是如何使用的。

三、getchar正确使用的例子(密码的输入)

        

#include
int main()
{
	//假设密码是123456
	char passkey[20] = { 0 };
	printf("请输入密码:");
	scanf("%s", passkey);
	printf("请确认密码:(N/Y)");
	char input = 0;
	scanf("%c", &input);
	if (input == 'Y')
		printf("确认成功");
	else
		printf("确认失败");
	return 0;
}

        如上代码,是一个简单的输入密码,并且进行确认的的一个简单的程序。我们运行一下看一看。

        我们会发现,当我们输入完123456之后,这个程序直接给出结果并且结束了,它并没有给我们进行确认密码是否输入正确的机会。而是在我们输入完密码后直接结束了,这是为什么呢?小编这里来为大家解释一下。

        我们这里用的scanf以及getchar这样的函数,都是输入函数,而这些函数并不是直接从我们的见键盘上拿东西,而是在键盘和读取函数之间有一个输入缓冲区,那工作原理是什么呢?当我们运行代码后,代码跑到scanf的时候,它并不是从键盘上直接拿东西,而是去输入缓冲区读取数据,这时,我们的输入缓冲区什么也没有,所以会闪烁光标,scanf正在等待,等待我们输入,这时我们就会输入123456加上一个回车(也就是\n),这时scanf发现缓冲区中有东西了,那么scanf就会去拿回车(也就是\n)之前的东西,因为scanf认为你按回车是想让密码输入进来,\n不是我们的密码,123456才是密码,这个时候密码123456就会被拿过来,放在passkey中去(如下图),

getchar的用法讲解_第3张图片 

        紧接着代码往下跑,请确认密码,这个时候又有scanf了,那么它第一时间会去看看缓冲区有没有东西,一看发现缓冲区中还有一个\n,那么这个\n就会被读取放到input里面了,然后直接继续往下走代码,这就导致了刚刚那种情况,到了请确认密码时,压根都没等待,第二个scanf还没等我们输入,已经读取了,直接结束了。

getchar的用法讲解_第4张图片

 

         但是我们期望的是在这里等待我们输入N/Y来确认密码,那么怎么解决这个问题呢,这里就需要一个getchar()来帮助我们清除缓冲区的\n,也就是在我们第二个scanf前面需要清楚缓冲区里面的内容就可以实现刚刚的目的。

int main()
{
	//假设密码是123456
	char passkey[20] = { 0 };
	printf("请输入密码:");
	scanf("%s", passkey);
	printf("请确认密码:(N/Y)\n");
	char input = 0;
	getchar();
	scanf("%c", &input);
	if (input == 'Y')
		printf("确认成功");
	else
		printf("确认失败");
	return 0;
}

getchar的用法讲解_第5张图片

 当我们把scanf前面加上一个getchar()来帮我们清除缓冲区的\n时,就会发现达到我们想到的效果了。(如上图所示)。

        那么到这里,有的人问题又来了,这个和我们最开始说的那个while循环又什么联系呢,小编这里再为大家演示一下,把while和getchar结合起来实现我们上面的效果。

        其实刚刚的代码是我们想的很简单一种状态,如果我们再给一种情况,那么可能就不能实现了,假设我们输入的是123456 abc,这时候就会发现还会出现上面的同样的错误。(如下图)        

 这是为什么呢?这里小编来为大家解释一下,我们依然是scanf第一次去读,我们输入的是123456+空格+abc,这里我们第一个scanf在读取的时候,只读取空格以前的东西,空格以及空格以后的东西我们第一个scanf读取不到,那么就会继续存放在缓冲区。(如下图)

getchar的用法讲解_第6张图片

 那么程序继续往下走,getchar()每次只能读取一个字符, 那么缓冲区那么多东西,我们getchar()一次肯定读取不完,那么怎么解决呢?如何清除缓存区呢?这时,我们就可以将while和getchar结合,来清理缓冲区剩余的所有数据。如下代码所示。

int main()
{
	//假设密码是123456
	char passkey[20] = { 0 };
	printf("请输入密码:");
	scanf("%s", passkey);
	printf("请确认密码:(N/Y)\n");
	char input = 0;
	//getchar();
	//清理掉缓冲区中剩余所有的数据
	while (getchar() != '\n');
	scanf("%c", &input);
	if (input == 'Y')
		printf("确认成功");
	else
		printf("确认失败");
	return 0;
}

        上述while语句的意思也就是,当我们getchar读取到的字符不等于'\n'时,我们就一直读取,直到getchar读取到'\n'时,(这里正好也把'\n'清理掉)不再进入循环。这样不管我们输入的时什么,再第二个scanf读取的时候,我们的缓冲区里面已经被清理干净了。如下图所示。

         那么到这里,小编今天要分享的内容就结束了,如果有哪里写的不对的,欢迎大家在评论区将问题指出来。如果觉得小编写的还不错的,可以留下你们的关注和点赞哈,然后和小编一起学习,一起进步!谢谢!

你可能感兴趣的:(c#)