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。代码如下:
- #include <stdio.h>
- #include <conio.h>
- int main()
- {
- int ch, cha;
- ch = getch();
- cha = getchar();
- printf("ch=%d, cha=%d\n",ch,cha);
- getch();
- return 0;
- }
- ENTER ENTER
- 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()标准库函数。
getch()和getchar()之再讨论的更多相关文章
- Java虚拟机JVM学习06 自定义类加载器 父委托机制和命名空间的再讨论
Java虚拟机JVM学习06 自定义类加载器 父委托机制和命名空间的再讨论 创建用户自定义的类加载器 要创建用户自定义的类加载器,只需要扩展java.lang.ClassLoader类,然后覆盖它的f ...
- getch与getchar区别
getch(): 所在头文件:conio.h 函数用途:从控制台读取一个字符,但不显示在屏幕上 getchar(): 所在头文件:stdio.h getch与getchar基本功能相同,差别是getc ...
- 通常每个套接字地址(协议/网络地址/端口)只允许使用一次。 数据库连接不释放测试 连接池 释放连接 关闭连接 有关 redis-py 连接池会导致服务器产生大量 CLOSE_WAIT 的再讨论以及一个解决方案
import pymysqlfrom redis import Redisimport time h, pt, u, p, db = '192.168.2.210', 3306, 'root', 'n ...
- getch(),getche(),getchar()的区别
先说基本区别. (1) getch()和getche()函数 这两个函数都是从键盘上读入一个字符.其调用格式为: getch(); getche(); 两者的区别是 ...
- getch 和 getchar 在 windows 和 unix下的区别
注意getch()是从console读取,(非标准函数) getch()需要的头文件是<conio.h>. 而getchar()是从stdin,一般是指键盘 windows平台下ENTER ...
- getch和getchar的区别
造冰箱的大熊猫@cnblogs 2018/11/30 1.getc() 头文件:stdio.h 函数声明:int getc ( FILE * stream ); 功能: - 返回流(stream)当前 ...
- Rocket - debug - DebugCustomXbar再讨论
https://mp.weixin.qq.com/s/YPFa6kE6I_Ud_MJGvzmS-g 简单讨论输入边/输出边Bundle的方向. 1. 上游节点的地址不重复 仔细看了一下sourceFn ...
- TAQSkinScrollBar 类美化滚动条再讨论
再说:TAQSkinScrollBar 类美化滚动条,http://www.138soft.com/?p=156 里面有人提到不可以滚动 滚动的改善方法: unit AQSkinScrollBar; ...
- 第十一篇:Linux中权限的再讨论( 下 )
前言 上篇随笔讲述了Linux中权限的大致实现机制以及目录权限的相关规则.本文将讲解Linux中的三种特殊权限:SUID,SGID,Sticky权限. 看完这两篇文章,你一定会对Linux的权限有个更 ...
随机推荐
- 分散式-ubuntu12.04安装spark-1.0.0
1. 安装文档: http://spark.apache.org/docs/latest/spark-standalone.html 2. web UI: master's web UI, which ...
- Android使用开发WebView战斗技能
转载请注明出处:http://blog.csdn.net/allen315410/article/details/44619181 前段时间做项目的时候.在项目中用了WebView组件,遇到了一些问题 ...
- fragment 中利用spinner实现省市联动
(1)布局文件就不在说明了,主要说代码的实现,先把代码贴上! package com.example.cl; import android.annotation.SuppressLint; impor ...
- solr/solrj原子更新
lucene原子更新自己不用多介绍,但solr它的包装,下面是一个简单的介绍是:这个操作是用于索引非常有用. 详细在代码中使用例如以下: /** * 原子更新方式 * */ public static ...
- 快讯:埃博拉患者Martin Salia去天堂了
下面是Martin Salia外科医生的遗像: 11月17日,埃博拉重病患者Martin Salia外科医生死了.请见:Ebola patient Dr. Martin Salia dies in O ...
- JavaScript运行命令
前言 动人js一段时间,我认为事情仅仅是一个很肤浅的理解.是非常欠缺的.所以開始使用博客来对这一部分的知识做个慢慢的记录和积累. 相信积少成多,慢慢的将这一部分的知识攻克! 第一篇记录的不是相关的应用 ...
- C#程序(含多个Dll)合并成一个Exe
把C#程序(含多个Dll)合并成一个Exe的超简单方法 开发程序的时候经常会引用一些第三方的DLL,然后编译生成的exe文件就不能脱离这些DLL独立运行了. 但是,很多时候我们本想开发一款只需要一 ...
- ZOJ 3822 可能性DP
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3822 本场比赛之前,我记得.见WALK概率路DP称号.那么它应该是可以考虑 ...
- MySQL分页实现
mysql> select pname from product; +--------+ | pname | +--------+ | 产品1 | | 产品2 | | 产品三 | +--- ...
- Git & Github 一页简明笔记(转)main
由于小组工程需要使用git&github的版本控制来协作,但我对其使用并不熟悉,特此写篇一页的笔记放在手边,备随时查阅. 使用方法:常用命令供随时查阅,其余内容供新手了解. 0. 常用命令一览 ...