admin管理员组

文章数量:1643254

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')
{
	;//空语句
}

这段代码会把键盘缓冲区中的所有字符包括回车字符也读取掉,那么在之前的代码中加入上述清理缓冲区代码:

如图所示: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,最终输入缓冲区清空,程序得以正常执行。

本文标签: 区中内容