首页 > 编程知识 正文

java从键盘输入数据,清空输入缓冲区

时间:2023-05-06 05:48:51 阅读:120059 作者:3499

getchar ) )是stdio.h的库函数,用于从stdin流读取字符。 也就是说,如果stdin中有数据,则可以直接读取,而无需输入数据。 另一方面,getch (和getche )是conio.h的库函数,负责从键盘接收字符。 getchar有显示。

与前面两个函数的区别在于,getchar ) )函数在按回车前等待输入并退出,换行前的所有输入字符将一个接一个地显示在屏幕上。 但是,只有第一个字符用作函数的返回值。

#包含

#include /*我在gcc中找不到此头文件。 可能改名或者取消了呢。 稍后找到后. */

Void主() )

{

char c;

c=getchar (; /*从键盘读取字符直到回车结束。 *///getchar ()其中只返回输入字符串的第一个字符,返回值为cputchar(c ) c ); /*显示输入的第一个字符*

printf((n ) n ) );

}

请试着运行这个程序。 我想还会出现疑问。 这就是我从缓冲器里读到的例子。 第一次运行getchar () (确实需要人工输入,但如果输入多个字符,则在以后的getchar ) )重新运行时将直接从缓冲区读取。

#包含

#包含

Void主() )

{

char c;

while((c=getchar ) )!='n ' ) getchar (每次读取一个字符() /

printf('%c ',c ); /*直接输出*

printf((n ) n ) );

}

运行程序时,首先停止,然后输入一系列字符串。 输入完成后,将输出输入的整个字符串。 咦,getchar ()不是说了只返回第一个字符吗? 这里怎么样?

因为我们输入的字符串并没有取第一个字符舍弃剩下的字符串。 它还在我们的内存里。 例如,打开闸门放水,我们在闸门进水后,打开一次闸门就放开一点,打开一次就放开一点,直到光线消失,这里打开闸门的动作相当于调用getchar ()。 我们输入的字符串也是如此。 首先,我们输入的字符串在内存的缓冲区里。 我们调用一次getchar ) )就输出缓冲区中出口最近的字符。 也就是说,输出最前面的文字。 输出后,将其释放,但后面有字符串,因此循环中的第一个字符将一个个地从内存中释放。

示例循环条件中的“n”实际上是输入字符串后的回车。 因此,在遇到滑架返回之前循环不会结束。 另一方面,getchar ) )函数通过在按下回车之前等待输入(或缓冲区中的数据)结束来实现整个字符串的输出。 当然,也可以像while () (c=getchar ) )那样改变循环条件!='a ' )是什么意思呢? 意思是遇到文字' a '就停止循环。 当然,如果输入“12345a213123n”,则只输出到a,结果为12345a。

注: getchar ) )中,从“流”的中途开始阅读。 因此,第一个getchar ) )接收刚中断的流队列中的上一个字符(上面举例说明,而不仅限于换行符)。 如果流队列不为空(getchar ) ),然后继续放水直到换行符也为空。我们使用getch (),为什么每次都在等待用户输入呢? getch ) )从键盘接收数据,并且立即接收,所以不能从stdin流读取数据。

添加:按键盘上的回车,生成双字符:回车'r ' (和换行符'n ' )。 换行符“ r”(Cr :运行返回:返回)将光标移回到此行的开头,并使用换行符((n ) ) (新行)换行。

所以输入文字' w '按下回车键后。 首先得到回车。 那个getchar函数结束了。 但是,有换行代码。 所以如果用getchar ()判断的时候。 最好再写一次getchar (以清除缓冲区中的“n”。

3 .如何清空输入缓冲区的内容?

如果希望getchar ()每次都等待用户输入,请清空缓冲区,并介绍如何(按平台)

在c标准中,fflush ) )函数用于刷新“输出”缓存。 未定义输入(stdin )。 但是,有些编译器还定义了fflush(stdin )的实现,如微软的VC。 其他编译器也定义了fflush(stdin )实现是否应该查找其文档。 GCC编译器未定义其实现,因此无法使用fflush(stdin )刷新输入缓存。

对于未定义fflush(stdin )的编译器,可以使用fgets ) )函数,因为它比getchar )、scanf )等函数更具通用性。 这样可以忽略输入流中剩余的其他输入(如回车),使下一个输入始终保持“干净”。 (这可以在任何平台上完成)

char sbuf[1024]; //.

Fets(sbuf,1024,stdin ); //.

在windows的vc下就可以了

这样了:

for(int i=0;i<10;++i)

{

char ch=getchar();

fflush(stdin);//每次都会有等待状态了

}

这里说到gcc编译器没有定义fflush的实现,我们一般用getchar();来清除缓冲区.

下面是我的讨论:

先来一段code:

#include

main()

{

char c;

for(;(c=getchar())!='a';)

printf("%c",c);

getchar();

c=getchar();

printf("%c",c);

}

输入:

ssss回车

得到:

ssss

光标处(等待输入)

说明:此时程序没有结束,进行到for循环,因为并没有字符a出现,所以还没跳出for循环.键入回车后,getchar

依次从缓冲区内取出(for循环):'s''s''s''s''n'

如果我们输入:

ssssa回车

得到:

ssss光标处(等待输入)

说明:程序已经跳出for循环,但是由于我们用getchar();清除了换行'n',后面第7句c=getchar();需要你输入一个字符(因为ssssa后面并没有新的字符),所以程序仍然没有结束.如果我们注释掉getchar();这一句,那么得到:

ssss

光标处(程序结束)

这个输入ssssa是的回车中的换行符'n'就被c=getchar();这一句读取并输出了。

总结:

键盘输入的字符都存到缓冲区内,一旦键入回车,getchar就进入缓冲区读取字符,一次只返回第一个字符作为getchar函数的值,如果有循环或足够多的getchar语句,就会依次读出缓冲区内的所有字符直到'n'.要理解这一点,之所以你输入的一系列字符被依次读出来,是因为循环的作用使得反复利用getchar在缓冲区里读取字符,而不是getchar可以读取多个字符,事实上getchar每次只能读取一个字符.如果需要取消'n'的影响,可以用getchar();来清除,这里getchar();只是取得了'n'但是并没有赋给任何字符变量,所以不会有影响,相当于清除了这个字符.还要注意的是这里你在键盘上输入ssss看到的回显正是来自于getchar的作用,如果用getch就看不到你输入了什么.再引一篇文章:http://www.cnblogs.com/biser/archive/2004/09/23/45704.aspx

1.机理

你键盘输入了东西,而此时你又没有用程序去getchar她,请问这个时候你按的键的状态保存在何处?为什么你一会儿去getchar的时候能得到呢

(例子好举,你先做一个1分钟延迟,然后再getchar,会发现一分钟前按的东西会显示出来)

实际上是 输入设备->内存缓冲区->程序getchar

你按的键是放进缓冲区了,然后供程序getchar

你有没有试过按住很多键然后等一会儿会滴滴滴滴响,就是缓冲区满了,你后头按的键没有存进缓冲区.

2.getchar()和getch()

然后就可以给你讲了

getchar是回车以后才进缓冲区

getch是每次都进缓冲区

用你的程序来说(我怎么觉得应该是n不是/n)

其实你输入computer,没按回车之前, 运行都停止在

getchar()里头,根本没有进入循环,自然也没有运行printf

洁净的大叔一按回车,才从getchar出来,然后以后因为键盘缓冲区里头有东西,就一个一个字符getchar出来了

想立刻回显,用getch就好了

分享到:

2010-09-08 11:06

浏览 1499

评论

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。