c语言判断用户是否输入-非阻塞函数kbhit
一、基础研究
要从地址读取数据,肯定是要定义一个指针变量p,用它来实现变换地址和取值的功能。另外程序是当两个条件中的某一个出现时才停止,所以应该用while~do循环语句循环输出n和d,并用while进行判断。这里实现三个问题:
(1)循环地把值转换成地址。
(2)判断偏移地址是否为0xffff。
(3)判断用户是否输入了‘q’。
前两个问题比较好实现,对于第三个问题我们需要注意的是c语言是怎么处理用户输入的。之前做汇编课设的时候我们研究过汇编对于输入的处理,并且尝试过两个中断,一个是要中止等待用户输入的,一个是不中止等待的。现在我们的需求就类似于第二个中断,即等待用户输入同时不停止程序的运行。
首先写了一个程序如下:

编译时警告说0xffff在比较中超过常量范围,也就是超过int型的范围,将整个程序的int改成long后警告消失。int是两个字节,应该正好能够容纳偏移地址0xffff,为什么比较时会超出范围呢?难道是与比较的机制有关吗?这里作为一个问题来扩展研究。
将编译之后的程序进行连接,出现错误:getchar()函数没有定义,这说明在我们当前连接的obj文件里没有getchar()函数,解决的办法有两个:(1)用#include<stdio.h>导入头文件。(2)不使用getchar()函数。在这里我们先尝试第二种方法,scanf()函数会暂停程序等待输入,并且在输入完后还要按回车才能继续向下执行,所以不符合我们的需求。查找资料发现getche()函数不用敲回车就可以将字符输入,而getch()函数不用敲回车,也不显示,只是将字符输入进行处理。而且这两个函数也不需要导入其他文件,修改后的程序如下:

这时发现还有一个问题:每次循环都还要用户输入字符才能向下进行,就是说函数是阻塞的。在网上查找资料发现输入函数都是阻塞型的,那么我们可以调整思路,检测用户是否输入。查找资料发现输入检测函数有kbhit()函数,如果有输入它会返回一个非0值,没有就返回0,修改后的函数如下:

运行程序,它会不停地打印地址和地址的值,直到用户输入字符q。
但是运行结果发现:当地址为0xffff时,程序并没有停止:

将程序改成如下所示也不行:

这里可能是判断语句有问题,结果将判断语句改为p==(long *)0xffff之后程序在地址为0xffff时可以停止,修改的程序为:

之前是对数进行比较,修改后是对指针进行比较,那为什么对数进行比较会出错呢?我们觉得是因为将p强制类型转换成long会出错,再次修改程序如下:

发现虽然有警告,但是程序仍能正常执行,这说明用long型确实会对地址判断有影响。
二、扩展研究
(1)int是两个字节,应该正好能够容纳偏移地址0xffff,为什么比较时会警告超出范围呢?
答:因为int是带正负的类型,它的最高位为符号位,而0xffff是unsigned int类型,所以会超出范围。这里把它进行强制类型转换就行了。
(2)Getchar()的实现方式。
答:getchar 由宏实现:#define getchar() getc(stdin)。所以要与头文件相关联,它不是真正的函数,而是定义为预处理器宏。
(3)为什么用(long)p==0xffff判断时会识别不到0xffff,导致循环停不下来?
答:同样这里应该是unsigned long类型。
三、研究总结
c语言是接近底层的语言,这在它和汇编的联系上可以看出来。之前做课设时要用到非阻塞中断,在这里是用到非阻塞函数,问题是相似的,只不过实现的语言变了。但是只要我们掌握了程序设计的精髓,其他的就只是语法上的实现问题了。
还有,独立分析和思考的能力真的很重要,我们不要养成随便问问题的习惯,要先自己思考,抓住问题的本质,提出自己的猜想,然后在询问别人或者查资料去证实,这样自己解决问题的能力才能够得到成长。
c语言判断用户是否输入-非阻塞函数kbhit的更多相关文章
- 判断用户Input输入的事件来进行登陆
我们是通过键盘按的object.keyCode获取的 Html <input onkeydown="keydownMsg(event)" type="text&qu ...
- JS判断用户连续输入
方案1 // // $('#element').donetyping(callback[, timeout=1000]) // Fires callback when a user has finis ...
- Linux设备驱动中的阻塞和非阻塞I/O <转载>
Green 博客园 首页 新随笔 联系 订阅 管理 Linux设备驱动中的阻塞和非阻塞I/O [基本概念] 1.阻塞 阻塞操作是指在执行设备操作时,托不能获得资源,则挂起进程直到满足操作所需的条件 ...
- Linux设备驱动中的阻塞和非阻塞I/O
[基本概念] 1.阻塞 阻塞操作是指在执行设备操作时,托不能获得资源,则挂起进程直到满足操作所需的条件后再进行操作.被挂起的进程进入休眠状态(不占用cpu资源),从调度器的运行队列转移到等待队列,直到 ...
- 芯灵思Sinlinx A64开发板 Linux内核等待队列poll ---阻塞与非阻塞
开发平台 芯灵思Sinlinx A64 内存: 1GB 存储: 4GB 开发板详细参数 https://m.tb.cn/h.3wMaSKm 开发板交流群 641395230 阻塞:阻塞调用是指调用结果 ...
- 【转载】高性能IO设计 & Java NIO & 同步/异步 阻塞/非阻塞 Reactor/Proactor
开始准备看Java NIO的,这篇文章:http://xly1981.iteye.com/blog/1735862 里面提到了这篇文章 http://xmuzyq.iteye.com/blog/783 ...
- 非阻塞式socket的select()用法
Select在Socket编程中还是比较重要的,可是对于初学Socket的人来说都不太爱用Select写程序,他们只 是习惯写诸如 connect.accept.recv或recvfrom这样的阻塞程 ...
- IO之同步、异步、阻塞、非阻塞 (2)
[原创链接: http://www.smithfox.com/?e=191, 转载请保留此声明, 谢谢! ] I/O Model 是一个很大的话题, 也是一个实践性很强的事情, 网上有各种说法和资料, ...
- I/O模型(同步、非同步、阻塞、非阻塞)总结
I/O:同步(synchronous).异步(asynchronous).阻塞(blocking).非阻塞(nonblocking) 1.I/O内部机制 出于安全考虑,用户程序(用户态)是没办法直接操 ...
随机推荐
- Maven搭建环境(Linux& Windows)
Linux下安装Maven 1.前提条件: 1)下载并安装好JDK .在终端输入命令“java -version”,如果出现类似如下信息说明JDK安装成功. $ java -version java ...
- Zimbra8.x邮件服务器安装及配置
官网地址:http://www.zimbra.com/downloads 下载说明: 1. 版本: zimbra有两个大版本:Open Source Edition和 Network Ed ...
- 新版福昕阅读器(Foxit Reader)启动速度慢解决办法
新版福昕阅读器(FoxitReader)启动速度慢解决办法之前喜欢使用福昕阅读器的原因就是看中了其小巧,可是最近版本的阅读器打开速度变得慢了很多(不是电脑配置问题),比AdobeReader还要慢,这 ...
- 自然数e这家伙怎么蹦跶出来的?
自然数e这家伙怎么蹦跶出来的? 之前看过一篇中文介绍自然数e的blog,引起了我的兴趣 原文是阮一峰大牛(我认为必须很有必要尊敬的称,大牛)嚼烂了吐出来的哈哈,只是我认为还是自己去看原文比較好 感觉非 ...
- Install Oracle 10g on Red Hat Linux 5.3 Step by Step
一.虚拟机配置 1. 虚拟机(VBox 4.3.12) 2. 配置虚拟机网卡网络.选择host-only.VirtualBox Host-Only Network网卡IP为设置为192.168.1.1 ...
- 经典算法:快排的Javascript版本
function swap(arr,l,r){ var temp=arr[l]; arr[l]=arr[r]; arr[r]=temp; } function partition(arr,camp,l ...
- 混血儿爹妈要混的远,数据库与WEB分离,得混的近
最近搞了个漫画网站,放在香港VPS,由于内存不够,把数据库移到了阿里云,混的远了点,没缓存的时候网站打开速度慢了1秒左右.笨狗漫画:http://www.bengou8.com 底部有sql时间cop ...
- Java基础知识强化75:正则表达式之分割功能(字符串中的数字排序案例)
1. 案例分析: 我有如下一个字符串:"91 27 46 38 50" 写代码实现最终输出结果是:"27 38 46 50 91" 分析: (1)定义一个 ...
- 06-自定义Attribute标记案例
自定义Attribute: 1)Attribute都从System. Attribute类继承,类名一般以Attribute结尾 2) 标记类的用途—AttributeUsage标记(标记的标记):A ...
- FFMPEG 视频旋转设置
fmpeg -i inputfile.mp4 -vf "transpose=1" outputfile.mp4 0=90CounterCLockwise and Vertical ...