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()标准库函数。

时间: 2024-10-11 22:11:14

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

getch与getchar区别

getch(): 所在头文件:conio.h 函数用途:从控制台读取一个字符,但不显示在屏幕上 getchar(): 所在头文件:stdio.h getch与getchar基本功能相同,差别是getch直接从键盘获取键值,不等待用户按回车, 只要用户按一个键,getch就立刻返回, getch返回值是用户输入的ASCII码,出错返回-1. 输入的字符不会回显在屏幕上.getch函数常用于程序调试中,在调试时,在关键位置显示 有关的结果以待查看,然后用getch函数暂停程序运行,当按任意键后程序继

getch 和 getchar 在 windows 和 unix下的区别

注意getch()是从console读取,(非标准函数) getch()需要的头文件是<conio.h>. 而getchar()是从stdin,一般是指键盘 windows平台下ENTER键会产生两个转义字符 \r\n, \r : 回到开头的地方. \n : 去到下一行开头 因此,getch()读到 \r 时就会返回他的ASCII码13.(后面的被无视了) 奇怪的问题是为什么getchar()会返回10呢? 前面不是说过返回第一个字符吗? 这的确会让人费解.实际上产生这个结果的原因是, get

getch和getchar的区别

造冰箱的大熊猫@cnblogs 2018/11/30 1.getc() 头文件:stdio.h 函数声明:int getc ( FILE * stream ); 功能: - 返回流(stream)当前位置的值,流的指针挪向下一个位置. - 如果读取失败,返回值为EOF,流的ferror被置位. - 如果已抵达流结尾,返回值为EOF,流的feof被置位. 2.getchar() 头文件:stdio.h 函数声明:int getchar ( void ); 功能:等效于getc ( stdin ).

算法初步:再讨论一点动态规划

原创 by zoe.zhang 动态规划真的很好用啊,但是需要练习,还有很多技巧要学习. 1.滚动数组 动态规划是用空间换取时间,所以通常需要为DP数组开辟很大的内存空间来存放数据,但有的时候空间太大超过内存限制,特别是在OJ的时候,容易出现MLE的问题.而在一些动规的题目中,我们可以利用滚动数组来优化空间. 适用条件:DP状态转移方程中,仅仅需要前面若干个状态,而每一次转移后,都有若干个状态不会再被用到,也就是废弃掉,此时可以使用滚动数组来减少空间消耗. 优点:节约空间. 缺点:在时间消耗上没

Rocket - debug - DebugCustomXbar再讨论

https://mp.weixin.qq.com/s/YPFa6kE6I_Ud_MJGvzmS-g 简单讨论输入边/输出边Bundle的方向. 1. 上游节点的地址不重复 仔细看了一下sourceFn的实现: 其中要求上游节点中不存在重复的地址: 这样也就不存在decoded中存在两个元素同时为真的情况: 2. source.addr := sink.addr 在lazy module的实现中,把sink.addr输入到source.addr中: 而在DebugCustomBundle的定义中,

Scratch 3.6角色碰到边缘反弹方向再讨论

引言 在Scratch中角色的移动是按一定方向移动的,所以方向在角色的移动中很重要,特别是在绘制一些几何图案的时候,不仅要考虑好移动距离,还必须确定好移动方向.下图给出Scratch 3.X中精灵的方向规定. Scratch积木"碰到边缘就反弹" Scratch的基本积木模块"碰到边缘就反弹",其反弹遵循物理学上光线的反射规律,即"入射角等于反射角"(入射方向与法线夹角为入射角:反射方向与法线夹角为反射角).参考下图: 为了下面讨论方便,我们特别

Tsinsen_A1024. 瓷砖问题再讨论

问题描述 有一长度为N(1<=N<=10)的地板,给定三种不同瓷砖:一种长度为1,一种长度为2,另一种长度为3,数目不限.要将这个长度为N的地板铺满,并且要求长度为1的瓷砖不能相邻,一共有多少种不同的铺法?在所有的铺设方法中,一共用了长度为1的瓷砖多少块? 例如,长度为4的地面一共有如下4种铺法,并且,一共用了长度为1的瓷砖4块: 4=1+2+1 4=1+3 4=2+2 4=3+1 编程求解上述问题. 输入格式 只有一个数N,代表地板的长度 输出格式 第一行有一个数,代表所有不同的瓷砖铺放方法

由浅拷贝讨论到深拷贝再讨论到接口(一):浅拷贝和深拷贝

接口ICloneable为我们实现了拷贝的梦想. (一)如何实现浅拷贝? 新建学校对象(School),实现接口ICloneable,如果我们这样写,即完成了浅拷贝:return base.MemberwiseClone(); public class School : ICloneable { public object Clone() { return base.MemberwiseClone(); } } 完整代码: 代码 1 using System; 2 3  namespace NY

TAQSkinScrollBar 类美化滚动条再讨论

再说:TAQSkinScrollBar 类美化滚动条,http://www.138soft.com/?p=156  里面有人提到不可以滚动 滚动的改善方法: unit AQSkinScrollBar; (* 说明:本单元提取自TdsaSkinAdapter控件,版权归原作者所有. 提取:www.138soft.com *) {$R Scroll.RES} interface uses ComCtrls, Windows, Messages, SysUtils, Classes, Graphics