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
评论