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内部机制 出于安全考虑,用户程序(用户态)是没办法直接操 ...
随机推荐
- 黑魔法__attribute__((cleanup))
原文地址:http://blog.sunnyxx.com/2014/09/15/objc-attribute-cleanup/ 编译器属性__attribute__用于向编译器描述特殊的标识.检查或优 ...
- Markdown入门指南-指间阁
宗旨 Markdown 的目标是实现「易读易写」. 可读性,无论如何,都是最重要的.一份使用 Markdown 格式撰写的文件应该可以直接以纯文本发布,并且看起来不会像是由许多标签或是格式指令所构成. ...
- 错误处理:java.lang.NoClassDefFoundError: org/apache/taglibs/standard/tag/rt/core/ForEachTag
在使用JSP.Servlet进行开发时,遇到java.lang.NoClassDefFoundError: org/apache/taglibs/standard/tag/rt/core/ForEac ...
- rman catalog (rman 恢复目录)
受控制文件大小的限制,一般rman需要用rman catalog来管理及存放备份信息: 这里介绍一下创建rman catalog的步骤: C:\Documents andSettings\Admini ...
- 固定textview大小,根据文字多少调整字体自适应textview大小
/** * 文件名 AutoResizeTextView.java * 包含类名列表 com.haier.internet.conditioner.haierinternetconditioner2. ...
- OKHttp源码解析
http://frodoking.github.io/2015/03/12/android-okhttp/ Android为我们提供了两种HTTP交互的方式:HttpURLConnection 和 A ...
- Configuring Network Configuration-RHEL7
1.查看网络状态systemctl status NetworkManager You can use the systemctl status NetworkManager command to ...
- 九度OJ 1552座位问题(dp)
刚开始写的一维数组,但是由于后面的数字较大,要对它取模,所以用一维数组进行减法运算,结果就不对了.所以还是得用二维数组,用dp[n][0]来表示第n位为男生总的方法个数,dp[n][1]表示第n位为女 ...
- noip 2005 等价表达式
/* 开始想的是 维护a的每个指数的系数 然而不好办 然而还有^10^10^10这种数据 特殊值带入吧 多搞几个素数 接下来就是玄学的事了 给a赋值之后 就是简单地表达式求值 虽然思路简单 但是字符串 ...
- 《photoshop cc 新功能 生成图像资源》智能切图逆天啦!
作为一个前端工程师切图这个步骤是必不可少的,方式多种多样,有和切图工具的,也有是把要切的图层元素或者组直接新建保存成文件的,现在photoshop cc2015,可以让你轻松切图,摆脱繁琐的切图步骤. ...