| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2357 人关注过本帖, 2 人收藏
标题:getchar()的问题
只看楼主 加入收藏
lythonmao
Rank: 1
等 级:新手上路
帖 子:14
专家分:7
注 册:2011-10-27
收藏
得分:0 
不好意思,我好像在10楼问了一个弱智的问题~~~
2011-11-12 17:29
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:5 
现在的教材,真是,该讲的不讲,不该讲的大讲特讲。

getchar()是流输入函数,一旦启用输入输出,没有遇到回车换行符,是不会有结果的,所有数据,都储存在缓冲区中待处理。因此,在你用getchar()函数接受函数的时候,它不理你的键盘动作,你可以尽管敲,但只要敲了回车,getchar()才真正行动起来,不过它只从你刚才敲的一大串字符序列中,提取一个字符,剩下的它不理了,留给下一个要从流输入中读数的函数去提取数据。所以,你这一大串敲下来的字符串,将灌入下一个流输入函数中,比如getchar()、gets()、scanf()等,这就是scanf()函数经常莫名其妙地被跳过的原因,就是上一次动作留下的数据被它读了,不用再敲。

流概念,教材不给你们讲,却去讲什么scanf()的格式,%d、%-4d之类,就是不该讲的大讲特讲。

要精细控制键盘击键,必须用getch()函数(TC系列是getch(),微软系列是_getch()),才会你敲一键它马上接收。比如,你需要4个字符的字符串,满4个字符就停止接收,也只有这个函数才能做到(此时你敲什么键它都能处理,按方向键也可以用程序控制光标来回走,也可以舍弃不合需要的按键,这是getchar()做不到的)。

[ 本帖最后由 TonyDeng 于 2011-11-12 17:47 编辑 ]

授人以渔,不授人以鱼。
2011-11-12 17:33
lythonmao
Rank: 1
等 级:新手上路
帖 子:14
专家分:7
注 册:2011-10-27
收藏
得分:0 
没想到我一个看似弱智的问题,竟然能得到如此精辟的知识。。。谢谢 TonyDeng。。。十分感谢`~~~~
2011-11-12 20:11
id3663423
Rank: 2
来 自:浙江
等 级:论坛游民
帖 子:48
专家分:63
注 册:2009-4-15
收藏
得分:0 
以下是引用TonyDeng在12-11-2011 17:33:53的发言:

现在的教材,真是,该讲的不讲,不该讲的大讲特讲。

getchar()是流输入函数,一旦启用输入输出,没有遇到回车换行符,是不会有结果的,所有数据,都储存在缓冲区中待处理。因此,在你用getchar()函数接受函数的时候,它不理你的键盘动作,你可以尽管敲,但只要敲了回车,getchar()才真正行动起来,不过它只从你刚才敲的一大串字符序列中,提取一个字符,剩下的它不理了,留给下一个要从流输入中读数的函数去提取数据。所以,你这一大串敲下来的字符串,将灌入下一个流输入函数中,比如getchar()、gets()、scanf()等,这就是scanf()函数经常莫名其妙地被跳过的原因,就是上一次动作留下的数据被它读了,不用再敲。

流概念,教材不给你们讲,却去讲什么scanf()的格式,%d、%-4d之类,就是不该讲的大讲特讲。

要精细控制键盘击键,必须用getch()函数(TC系列是getch(),微软系列是_getch()),才会你敲一键它马上接收。比如,你需要4个字符的字符串,满4个字符就停止接收,也只有这个函数才能做到(此时你敲什么键它都能处理,按方向键也可以用程序控制光标来回走,也可以舍弃不合需要的按键,这是getchar()做不到的)。
能举个例子吗?我也是被现在教材所毒害的一个.....

每多学一点知识,就少写一行代码.
2011-11-12 20:13
馨梦惜夕
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:54
专家分:190
注 册:2011-5-18
收藏
得分:0 
这样只是循环了一次啊  还能输入一行吗?
2011-11-12 20:42
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
getchar()函数的原型在stdio.h中,所谓stdio,就是标准(std)输入输出(io)的意思,是一种与平台无关的流输入输出概念。“流”,类似于水流、字符串流、文件流,是一种连续性的、有顺序的流动体,无论输入还是输出,都从流出口到流入口,中间是存储池(所谓的缓冲区buffer),数据流入池中,等待接收时流出。流入和流出的速度可能不相等,如果流入快流出慢,池可能会溢出(这就是一般流数据都有缓冲区大小设置的原因);流入慢,才会处于等待状态(通常的程序设计假定从池子是空的开始,但随着操作的进行,实际情形未必如此,则需要留意判断)。流输入时,回车换行符类似于开关,流入一股数据,然后关闭,gets()就把这些数据全部接收下来;getchar()是逐个逐个收,但未必能够全收。不管怎样,只要池子不空,流输入函数getchar()、gets()、scanf()就从池子中提取数据,而不会再等待拧开水龙头流入数据,池子空了,才会等流入。这种流模式的函数,是通用的,控制台、流文件、字符串流,其实都是同样的流模型,所以gets()和fgets()、sscanf()、fscanf()等等函数,用法都是一样的。在C++中,它们其实就是从同一个类中派生出来的东西,只是C没有类概念,就用不同的函数名来区别。

getch()的函数原型在conio.h中,con是控制台(console)的意思,专用于键盘和显示屏,是对特定硬件操作的,在这个头文件中定义的函数,都是与控制台硬件打交道的,与平台紧密相关(TC的gotoxy()、clrscr()、settextcolor()等函数,也定义在这里,就是这个意思,特别地,TC的graphics.h中的库函数,更是独特,它是针对EGA、VGA显示卡特制的),这个函数库中的函数,各个编译器的实现方式不同、不容易移植,就因为它直接操纵硬件。这个库函数的东西,效率非常高(越不通用,效率越高)。getch()检测键盘按键(TC在DOS时代是直接扫描键盘电路对计算机的信号,微软是通过操作系统中断获取,因此TC总是比微软的快,但兼容性很不好)。对功能键,比如F1、F2、Alt+F3、Ctrl+A、光标控制键、数字小键盘之类,getchar()是无能为力的,只有getch()可以,因此游戏程序,必定是用这里的函数的(当然也可以用高效的DirectX API函数)。

测试这个两个函数很简单:首先c = getch(),把c打印出来,判断c是否0xE0,如果是,则再getch()一次并打印,运行的时候,按Alt+某键或光标上下左右试试,就知道这种组合按键的内码是什么,得到键码之后,就可以用来控制程序流程。用getchar()读不出来的。

授人以渔,不授人以鱼。
2011-11-12 20:57
yu376021
Rank: 2
等 级:论坛游民
帖 子:41
专家分:68
注 册:2011-11-11
收藏
得分:0 
如果c=getchar()放在while的判断句里,那么while循环就可以多次读,所以可以多次输入,但是如果你放在前面的话,那么循环只到while,while以上的语句就不会在读了,所以只可以输一次,而且循环还是死循环,如过硬是要放在前面的话,同意四楼的说法,在加while复合句末尾里面getchar()
2011-11-12 21:28
stephenluu
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2011-12-9
收藏
得分:0 
回复 6楼 lythonmao
当用循环计算输入的“3+5+6+4”时两者就不一样了,后者逐个输入按enter会换行,做不出计算表达式的作用。
2011-12-09 01:18
youlanke
Rank: 1
等 级:新手上路
帖 子:7
专家分:2
注 册:2012-2-28
收藏
得分:0 
同意四楼说法,刚看到!
2012-03-13 20:30
快速回复:getchar()的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018241 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved