细解有关C语言输入函数getchar在输入缓冲区导致的换行问题,通俗易懂,茅塞顿开

细解有关C语言输入函数getchar在输入缓冲区导致的换行问题

@@凡凡爱吃粉

一.getchar函数用法及应用

二.细解使用getchar输入缓冲区的换行问题

序言:学习字符串章节时,我接触到一个字符输入函数getchar,但是,学习这个函数之后,如果你和我一样对程序后面的运行原理较真的话,你会对getchar函数使用后的输入缓冲区变化产生好奇和疑问:书上说使用getchar函数后,缓冲区会生成一个换行符,如果你想二次输入但不对这个换行符进行处理的话,那程序在你第一次输入并按下回车后,会直接结束,再三考虑后我决定用while循环来处理换行符,但这个换行符是怎么来的呢?输入缓冲区的变化又是怎样的呢?接下来让我向你展示背后的所有细节吧,希望这篇文章对你理解getchar函数和输入缓冲区有帮助。

1.getchar函数用法及应用:
getchar函数是字符的输入标准函数(作用类似于scanf),通常和字符输出标准函数putchar连着使用(作用类似于printf),两者都包含在库文件stdio.h中;
getchar声明:int getchar();//作用:从键盘接收一个字符,并返回该字符;
getchar函数的执行过程:检验缓冲区是否为空,如果不为空,直接提取最开头的那个字符;如果为空,等待用户从键盘输入;(如果看不懂这个执行过程,别急,请往下看关于缓冲区的换行问题讲解,你可能就明白了)

2.细解使用getchar输入缓冲区的换行问题:
在将解这个问题之前,请看下面代码,这是我在学习getchar时书上提供的一段代码,也因此我产生了对关于使用getchar后缓冲区的疑惑:

#include<stdio.h>
int main()
{
	int ch, temp;
	printf("输入一个字符:");
	fflush(stdin);
	ch = getchar();
	putchar(ch);	
	printf("请再输入一个字符:");
	fflush(stdin);
	ch = getchar();
	putchar(ch); 
	return 0;
}

在这段代码中,我们定义了一个ch的变量来存储输入的字符,在每次执行getchar函数之前,我们都调用了函数fflush(stdin)来清空缓冲区,其中实参stdin是符号化的指向缓冲区的指针常量。
那为什么要使用fflush这个函数呢?这就涉及到缓冲区问题了:
输入缓冲区存在于输入流中,当我们在键盘上输入我们想输入的数据到控制窗口,电脑会将我们输入的数据先保存到输入缓冲区输,这时我们输入的数据并未参与到程序执行过程中(因为还未按下回车),完成输入后我们会按下回车键让程序执行,按下回车后电脑才会从输入缓冲区读取我们输入的数据,但是关键的是:当每次你按下回车后,电脑会自动在你输入的数据结尾加一个换行符(“\n”)并读取换行符前那些你之前输入的数据,这就是为什么我们需要一个类似于fflush这样的函数来清空一下缓冲区,我们需要fflush这样的函数来清除你按下回车键后产生的换行符
下面我将用图解释(以getchar函数为例):
在这里插入图片描述

按照书上代码使用fflush函数,按下运行,执行结果如何呢?请看图:

在这里插入图片描述
我输入了x,程序给过输出了一个x,这里没问题,但这段代码本意是二次出入,可是没想到的是程序并没有给我第二次输入的机会,而是直接结束了运行并留出一个空行,我很诧异,于是去查了资料,得到原因是:在C语言中,fflush(stdin); 是一个经常被误解和错误使用的语句。fflush 函数通常用于清空输出缓冲区(即刷新输出缓冲区到文件或设备),但是标准C库并没有定义 fflush(stdin) 的行为。在大多数实现中,fflush(stdin) 的行为是未定义的,这意味着它可能不会按照预期工作这就意味着fflush函数没起作用,换行符并未被清除而是被读取使用了(这也是图中有一个空行的原因),于是我去查找了解决办法,得到的一个比较好的回答是使用:while ((temp = getchar()) != ‘\n’ && temp != EOF);这句代码来替代fllush函数;
while ((temp = getchar()) != ‘\n’ && temp != EOF)这句代码所实现的效果是读取并丢弃电脑自动生成的换行符,但这句代码比fflush函数更加安全。
因此我们可以得到以下代码:

#include<stdio.h>
int main()
{
	int ch, temp;
	printf("输入一个字符:");
	ch = getchar();
	putchar(ch);	
	printf("请再输入一个字符:");
	while ((temp = getchar()) != '\n' && temp != EOF);
	ch = getchar();
	putchar(ch); 
	return 0;
}

我们创建一个临时变量temp,并在while循环的判断语句中使用getchar函数。当我们第一使用getchar函数,我们在输入缓冲区输入一个字母,然后按下回车,按下回车后getchar读取你输入的字母到程序中通过putchar函数打印出来,同时电脑自动在输入缓冲区生成一个换行符,这时我们在while循环的判断语句中再次使用getchar函数,将缓冲区中自动生成的换行符读取并保存在临时变量temp中,并检查temp中是否真的保存了getchar读取的换行符(temp != EOF:检查作用);这样换行符就被读取并被丢弃了(在这里丢弃是指:换行符被保存在临时变量temp中,但temp并未真正参与到程序中,而是在程序执行结束后消毁了

这里我再拿两个不同代码的执行结果进行对比,一目了然:

#include<stdio.h>
int main()
{
	int ch, temp;
	printf("输入一个字符:");
	ch = getchar();
	putchar(ch);	
	printf("请再输入一个字符:");
	/*while ((temp = getchar()) != '\n' && temp != EOF);*/
	ch = getchar();
	putchar(ch); 
	return 0;
}

这里我先将while ((temp = getchar()) != ‘\n’ && temp != EOF)这句代码先注释了,看看结果如何:
在这里插入图片描述
再看看加上while循环的执行效果:
在这里插入图片描述
这里我获得了第二次出入的机会,程序并未直接结束,说明while循环起了作用,换行符被成功读取并丢弃;
在这里插入图片描述

第二次我输入了字母’r’并得到正确结果r,当然第二次输入时我们也使用了getchar函数并按下了回车,说明第二次输出r后,缓冲区又自动生成一个换行符,但是由于下面的程序是return,程序结束了,所以换行符没影响了。
这类问题在输入函数scanf也有出现,可以有所借鉴

好了,到这关于C语言输入函数getchar在输入缓冲区导致的换行问题就介绍完了,希望这篇文章对你有帮助,关注我@凡凡爱吃粉,带你了解细思极恐的编程语言知识,哈哈,加油,奥利给!

  • 43
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值