getch()和getchar()之再讨论

原文:getch()和getchar()之再讨论

在C语言的字符处理函数中,getch()和getchar()是经常让人迷惑的两个函数,他们都有一些“奇怪的”特点让初学者摸不着头脑。两个函数有很多相似之处,却又有很大的不同。下面是两个函数的说明:

int getch( void ); Get a character from the console without echo

int getchar ( void );   Get character from stdin, Returns the next character from the standard input (stdin).It is equivalent to getc with stdin as its argument

可以看到,两个函数都没有参数,都是读入一个字符,返回值都是int型。但是注意getch()是从console读取,而getchar()是从stdin,一般是指键盘。要试验两者的区别,你可以写一个getch()看看不从键盘输入,比如直接用鼠标复制一段字符粘贴到console上,你会看到getch()会立即返回,但getchar一直等待,直到遇到 ENTER 键。

他们还有下面几个区别:

首先,getchar()是C的标准库函数,包含在头文件<stdio.h>中,而getch()需要的头文件是<conio.h>。

其次,getch()读到一个字符就返回,不管是什么字符,所以,在TC时代经常被放在程序最后面,达到“按任意键退出”的效果。而getchar()直到遇见ENTER 键才返回,返回值是第一个字符,但是后面的字符也不会被丢弃,而是保存在一个缓冲区内。

前几天,群里有人问getch()和getchar()的区别,原因是他键入enter后,前者返回13,而后者返回10。代码如下:

  1. #include <stdio.h>
  2. #include <conio.h>
  3. int main()
  4. {
  5.     int ch, cha;
  6.     ch = getch();
  7.     cha = getchar();
  8.     printf("ch=%d, cha=%d\n",ch,cha);
  9.     getch();
  10.     return 0;
  11. }
  12. ENTER ENTER
  13. ch=13, cha=10

复制代码

这里特别说明一下,这段代码是在windows平台下,才会产生如上所说的差异。原因是windows平台下ENTER键会产生两个转义字符 \r\n, 因此,getch()读到 \r 时就会返回他的ASCII码13。

奇怪的问题是为什么getchar()会返回10呢?前面不是说过返回第一个字符吗?

这的确会让人费解。实际上产生这个结果的原因是,getchar()把输入的 \r\n 转换成了 \n ,所以返回的是 \n 的ASCII码 10。为什么会这样呢?因为前面说过getchar()是C语言标准库函数,而在unix系统中ENTER键只产生 \n 。顺便说一下,在MAC OS中ENTER键将产生 \r ,同样也会被替换成 \n。这样,不管在什么平台下,getchar()都会得到相同的结果,所以说getchar()标准库函数。

时间: 2025-01-02 08:15:13

getch()和getchar()之再讨论的相关文章

C语言中getch()与getchar()

getch()(): 所在头文件:conio.h 函数用途:从控制台读取一个字符,但不显示在屏幕上 例如: char ch;或int ch; getch()();或ch=getch()(); 用getch();会等待你按下任意键,再继续执行下面的语句; 用ch=getch();会等待你按下任意键之后,把该键字符所对应的ASCII码赋给ch,再执行下面的语句. getchar()(): 该函数声明在stdio.h头文件中,使用的时候要包含stdio.h头文件.如: #include int get

c语言-c中的getch和getchar有什么区别吗?

问题描述 c中的getch和getchar有什么区别吗? c中的getch和getchar有什么区别吗?一直很混淆,搞不清楚.网上说的和时间的出来的相反. 解决方案 getch直接得到的是缓冲区的键盘码,getchar是一个宏,从流中读取字符.这个流可以被重定向到文件.管道,不一定是键盘输入. 解决方案二: 以下是ubuntu系统man手册的中的说明 getc() is equivalent to fgetc() except that it may be implemented as a ma

大数据的伦理再讨论

文章讲的是大数据的伦理再讨论,3月13日,在人工智能机器人AlphaGo和围棋冠军李世石"人机大战"的第四轮较量当天,一场和"大数据营销"相关的商业研讨在中欧国际工商学院北京校园举行,由中欧国际工商学院.清华大数据产业联合会与中信出版集团联合主办,由中信出版社出版推出的<颠覆营销:大数据时代的商业革命>也在此举行了首发仪式.虽然听起来是两个完全不同的领域,但实际上,大数据作为人工智能的核心算法之一,已经被科技公司应用于各种百姓看得到或者看不到的地方,为日

c语言中getch,getche,getchar的区别_C 语言

getchar 是stdio.h中的库函数,它的作用是从stdin流中读入一个字符,也就是说 ,如果stdin有数据的话不用输入就可以直接读取了.而getch()和getche()是conio.h中的库函数,它的作用是从键盘接收字符. getch() 实际是一个输入命令,作用是从键盘接收一个字符,而且并不把这个字符显示出来,就是说,你按了一个键后它并不在屏幕上显示你按的什么,而继续运行后面的代码,所以我们在C++中可以用它来实现"按任意键继续"的效果,即程序中遇到getch();这行语

aop cache再讨论

/** *作者:张荣华 *日期:2008-11-07 **/ 开门见山,一刀见血,让我们说说烦人的aop cache. aop cache解释使用aop技术的cache,可以cache被代理对象的方法返回结果,还可以通过方法的参数值来控制缓存的粒度,看上去很美,用的人估计也颇多,好东西啊,面试的时候经常有人告诉我"我用过aop cache",看来是居家必备啊.不过居家必备的东西也得升个级什么滴啊,就想汽车一样,每年拉一次皮,照卖,还自夸是新一袋.aop cache要升级得先看看它烦人得

Excel中数据输入的再讨论

<中国电脑教育报>2005年第12期F5版的<郁闷的减法公式输入>文中动用了单元格拼接和添加无关文字两种方法来解决http://www.aliyun.com/zixun/aggregation/16544.html">Excel自动将用户输入的"6-2"变成日期"6月2日"的问题,虽然构思巧妙,但根本没有必要这么麻烦, 其实有更简单的解决方法. 选定单元格(可以是多个单元格)后选择菜单"格式→单元格",或直

关于getchar函数缓冲区的问题

最近,看到有同学问我关于getchar()这个函数缓冲区的问题,结合我以前的学习,我将对getchar()进行一次总结,当然,这些都是别人已经提过的东西,我只是总结,接下来我们来看看. 首先,用getchar()函数进行字符的输入,并不是直接从键盘这个硬件中读取输入的字符,而是从"输入缓冲区"中得到的字符.输入缓冲区是一个字符的队列,其中存储了所有你尚未读取的字符.每次调用getchar函数,它就会从输入缓冲区中读出第一个字符,并把这个字符从输入缓冲区中清除.然而,这个输入缓冲区的设计

Linux下C编程:getchar()详解

getchar 函数名: getchar 功 能: 从stdin流中读字符 用 法: int getchar(void); 注解: getchar有一个int型的返回值.当程序调用getchar时.程序就等着用户按键.用户输入的字符被存放在键盘缓冲区中.直到用户按回车为止(回车字符也放在缓冲区中).当用户键入回车之后,getchar才开始从stdin流中每次读入一个字符.getchar函数的返回值是用户输入的第一个字符的ASCII码,如出错返回-1,且将用户输入的字符回显到屏幕.如用户在按回车之

请别再拿“String s = new String(&amp;quot;xyz&amp;quot;);创建了多少个String实例”来面试了吧

这帖是用来回复高级语言虚拟机圈子里的一个问题,一道Java笔试题的. 本来因为见得太多已经吐槽无力,但这次实在忍不住了就又爆发了一把.写得太长干脆单独开了一帖. 顺带广告:对JVM感兴趣的同学们同志们请多多支持高级语言虚拟机圈子  以下是回复内容.文中的"楼主"是针对原问题帖而言. =============================================================== 楼主是看各种宝典了么--以后我面试人的时候就要专找宝典答案是错的来问,方便筛人