首页 > 编程语言 >C/C++清理输入缓冲区中的内容

C/C++清理输入缓冲区中的内容

时间:2022-10-27 23:56:50浏览次数:83  
标签:读取 scanf 清理 C++ 回车符 缓冲区 输入 getchar

C/C++清理输入缓冲区中的内容
1.清理输入缓冲区最后剩下的单个回车符:
方法一:用getchar函数读取回车符:
方法二:用scanf("%*c")读取掉回车符:
方法三:用scanf(" %c",&ch):
2.清理输入缓冲区中剩下的所有内容:
方法一:用getchar函数结合循环语句 :
方法二:用scanf("%*[^\n]"):
1.清理输入缓冲区最后剩下的单个回车符:


scanf读取字符时遇到空格和回车符时都会停止读取,如上述代码,我们输入abcdefgh然后按下回车键,此时输入缓冲区内容:abcdefgh\n,输入缓冲区遇到\n,scanf语句开始读取,scanf语句会把我们输入的字符串abcdefgh存储到字符数组intput中,遇到\n停止,因此此时输入缓冲区还剩一个\n,然后用getchar函数读取我们准备输入的"Y",但是由于输入缓冲区中还有一个回车符,因此我们还没来得及输入”Y",getchar()就会读取输入缓冲区中最后的单个回车符,故此时ch = ‘\n’,所以会输出确认失败。

应对这种情况,我们只需要事先将输入缓冲区中最后的回车字符读取掉就可以了:

方法一:用getchar函数读取回车符:


我们输入abcdefgh并按下回车键,此时输入缓冲区的内容为:abcdefgh\n,输入缓冲区遇到\n,scanf开始读取,scanf会把abcdefgh读取并存储到字符数组中,遇到\n后停止,此时输入缓冲区的内容为:\n,我们先用一个getchar()把输入缓冲区的回车符都去掉,这个时候输入缓冲区就清空了,后面的程序得以正常执行。

方法二:用scanf(“%*c”)读取掉回车符:
scanf(“%*c”):读取单个字符。

 

我们输入abcdefgh并按下回车键,此时输入缓冲区的内容为:abcdefgh\n,输入缓冲区遇到\n,scanf开始读取,scanf会把abcdefgh读取并存储到字符数组中,遇到\n后停止,此时输入缓冲区的内容为:\n,然后用scanf(“%*c”)读取输入缓冲区中最后的单个回车符,这个时候输入缓冲区就清空了,后面的程序得以正常执行。

方法三:用scanf(" %c",&ch):
scanf(" %c,&ch):输入缓冲区最后的单个回车符会被%c前面的空格读取,这样我们最后输入的字符就会被scanf读取并赋值给变量ch:

 

2.清理输入缓冲区中剩下的所有内容:
仔细看下图代码,为什么又出现了上述情况,还没等我们输入,程序就自动输出确认失败了:

 

当我们输入hhh wwrer时并按下回车键后,此时输入缓冲区的内容为:hhh wwrer\n,然后由scanf语句进行读取,当scanf语句读取到空格就结束了,此时输入缓冲区的内容为: wwwrer\n,因此第一个getchar()就会把空格读进去,然后第二个getchar就把‘w’读进去了并赋值给变量ch,然后执行下面的if语句,那肯定会直接输出确认失败。

所以当我们需要重新输入字符让getchar()读取的时候,我们最好先清理键盘缓冲区中的所有内容,我们可以考虑用下面代码来清理缓冲区:

方法一:用getchar函数结合循环语句 :
int tmp = 0;

while ((tmp = getchar()) != '\n')
{
;//空语句
}
1
2
3
4
5
6
这段代码会把键盘缓冲区中的所有字符包括回车字符也读取掉,那么在之前的代码中加入上述清理缓冲区代码:

 

如图所示:scanf将hehe读取到字符数组中后,输入缓冲区中的剩余字符都被清理了,程序得以正常执行。

方法二:用scanf(“%*[^\n]”):
scanf(“%*[^\n]”):表示从缓冲区中读取掉任意字符,只要不是\n就⼀直进行,遇到\n才停下。这时输入缓冲区中还剩下一个\n,那么又回到了最开始讨论的问题,清除输入缓冲区中最后的单个回车符:用scanf(“%*c”)和getchar函数:


先输入hehe sdsdsd按下回车键,此时输入缓冲区的内容为:hehe sdsdsd\n,输入缓冲区遇到\n,故第一条scanf语句开始读取,scanf遇到空格停止,此时输入缓冲区中的内容为: sdsdsd,然后开始清空缓冲区,由第二条scanf语句开始读取,遇到\n停止,此时输入缓冲区的内容为:\n,然后第三条scanf语句开始读取\n,最终输入缓冲区清空,程序得以正常执行。

https://blog.csdn.net/weixin_44049823/article/details/124754600

标签:读取,scanf,清理,C++,回车符,缓冲区,输入,getchar
From: https://www.cnblogs.com/htu2021/p/16834433.html

相关文章