怎样在C语言程序中使用功能键和箭头键?

在程序中使用功能键和箭头键可以使程序更容易使用。箭头键可用来移动光标,而功能键使用户能做一些特殊的事情,还可用来替代一些经常要键入的字符序列。

然而,与其它“特殊”功能一样,C语言本身并没有提供读入功能键和箭头键的标准方法。用scanf()来接受这些特殊字符是不可取的,同样,用getchar()也不行。为此,你需要编写一个小函数,让它向DOS询问被按下的键的值。请看下例:
    #include<dos.h>
    int GetKey()
    {
       union REGS in,out;
       in.h.ah=0x8;
       int86(0x21,&in,&out);
       return out.h.al;
    }
这种方法跳过C的输入/输出库,直接从键缓冲区中读取下一个键。这样做的好处是不会漏掉特殊的键码,并且所按的键能立即得到响应,而不用先存到缓冲区中,等到按下Enter键时才得到响应。

通过这个函数你可以得到所按的键的整数值键码。请看下面这个测试程序:   
# include <stdio. h>
# include <dos. h>
int GetKey()
      union REGS in, out ~
      in. h. ah = 0xS~
      int86( 0x21, &in, &out );
      return out. h. al;
int main()
{
      int c ;
      while (   c=GetKey() ) !=27 )
                     / * Loop until escape is pressed */
     {
          printf ("Key = %d.\n" , c );
     }
       return 0 ;
}
如果你键入一个字符串,那么上述程序可能会输出这样的结果:
    key = 66.
    key=111.
    key=98.
    key=32.
    key=68.
    key=111.
    key=98.
    key=98.
    key=115.
当你按下功能键或箭头键时,将发生不同的情况:你所看到的将是一个0,其后跟着一个字符值。这就是特殊键的表示方法:在一个0值后面跟着一个特殊的值。

因此,你可以用两种方法来处理特殊键。首先,你可以检测GetKey()的返回值,一旦检测到一个0,你就按特殊的方式去处理GetKey()读入的下一个字符。其次,你可以在GetKey()中检测读入的字符值,一旦检测到一个0,就接着读入下一个字符值,然后按某种方式修改这个值,并返回修改后的值。第二种方法比第一种方法更好。下面是一个改进了的GetKey()函数:
/*  
New improved key-getting function.
*/
int GetKey()
      union REGS in, out;
      in. h. ah = 0x8;
      int86( 0x21, &in, &out );
      if (out. h. al == 0 )
            return GetKey ( ) + 128 ;
      else
            return out. h. al ;
这种方法中更清晰也最有效,它使程序无需检查是否读入了特殊键,因此减轻了程序员的工作量。在这种方法中,特殊键的值总是大于128。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/450600.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

中文地址

2019独角兽企业重金招聘Python工程师标准>>> 转载于:https://my.oschina.net/u/2935389/blog/2209087

python+selenium十:selenium的二次封装

pythonselenium十&#xff1a;基于原生selenium的二次封装 from selenium import webdriverfrom selenium.webdriver.support.wait import WebDriverWaitfrom selenium.webdriver.support import expected_conditions as ECfrom selenium.webdriver.support.select import Sele…

TDD开发模式实现代码功能逻辑(自己总结,持续更新)

1.先写测试 2.要使程序尽快的通过&#xff08;及早交付&#xff09; 3.优化程序结构&#xff0c;尽量使程序尽量快的运行 4.不要怕修改&#xff0c;单元测试会保证接口的正常运行 5.能通过测试后再去重构&#xff08;消除冗余&#xff0c;优化程序设计&#xff09; 6.用尽…

Intellij IDEA Debug调试技巧

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 1、这里以一个web工程为例&#xff0c;点击图中按钮开始运行web工程。 2、设置断点 3、使用postman发送http请求 4、请求发送之后会自动…

15行代码让苹果设备崩溃,最新的iOS 12也无法幸免

安全研究人员Sabri Haddouche发现了一个只需几行代码就可以让iPhone崩溃并重启的方法。\\Sabri Haddouche在GitHub上发布了一个示例网页&#xff0c;只有15行代码&#xff0c;如果在iPhone或iPad上访问这个页面&#xff0c;就会崩溃并重启。在macOS上使用Safari打开该页面也会出…

appium更新到1.8.2,不能打开运行的解决办法

1、更新下载appium 1.8.2 打开运行 一直是这个界面。很烦躁&#xff0c;重启电脑或者卸载后重新安装还是没有用。 解决版本&#xff1a; 1、查看老版本和新版本的安装位置 老版本默认是 C:\Program Files (x86)/appium安装新的版本后&#xff0c;地址是&#xff1a;C:\Users…

C语言运算符及其优先级汇总表口诀

C语言运算符及其优先级汇总表口诀圆下箭头一顿号非凡增减富强针地长三乘除&#xff0c;四加减&#xff0c;五移位千万别把鱼忘记&#xff0c;它在盛饭的厨子里小灯大灯灯灯不等爸喂鱼&#xff0c;舅疑惑&#xff0c;裸鸡也疑惑十三姨&#xff0c;十四父&#xff0c;十五逗&…

laraval如何使用tdd

1.首先新建一个laravel birdboard项目 composer create-project --prefer-dist birdboard 2.新建单元测试 php artisan make:test ProjectTest 3.书写单元测试 对于初学着来说&#xff0c;最好先预测tdd即将要出现的错误&#xff0c;然后进行测试&#xff0c;判断是否和自…

让你页面速度飞起来 Web前端性能优化

百度网盘下载 第1章 课程简介对课程做简单的介绍。第2章 资源合并与压缩通过本章&#xff0c;我们学习和理解了web前端的概念&#xff0c;以及性能优化的意义所在&#xff0c;并且通过实战中的压缩与合并&#xff0c;深入理解了减少http请求数和减少http请求资源大小两个优化要…

spring-data-JPA使用JpaRepository注解自定义SQL查询数据库多表查询

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 一. 首先在Entity注解的类里面要写好外键关系. 这个 ManyToOne 注解可以建立外键关系, 不要在自己傻傻的写一个 private int grades_id…

工厂示例

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Configuration; using System.Reflection;namespace Common.DALFactory {/// <summary>/// 数据层对象实例创建/// </summary>public partial class DbFacto…

手把手教你如何优化C语言程序

程序进行优化&#xff0c;通常是指优化程序代码或程序执行速度。优化代码和优化速度实际上是一个予盾的统一&#xff0c;一般是优化了代码的尺寸&#xff0c;就会带来执行时间的增加&#xff0c;如果优化了程序的执行速度&#xff0c;通常会带来代码增加的副作用&#xff0c;很…

posman使用教程

1.新建文件夹 2.新建请求&#xff0c;右击文件夹&#xff0c; 3.点开测试文件&#xff0c;有get,put,post方法&#xff0c;我经常使用的是put方法&#xff0c;区别我就不讲了 4.我基本上填在body里面 5.这是基本的使用&#xff0c;我来更高级一点添加环境变量&#xff0c;一共有…

Linux实战教学笔记42:squid代理与缓存实践(一)

第1章 Squid介绍 1.1 缓存服务器介绍 缓存服务器&#xff08;英文意思cache server&#xff09;,即用来存储&#xff08;介质为内存及硬盘&#xff09;用户访问的网页&#xff0c;图片&#xff0c;文件等等信息的专用服务器。这种服务器不仅可以使用户可以最快的得到他们想要的…

Mysql中DATE_SUB 使用方法结合查询一天内,一周内,一月内的信息实例讲解

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 在对数据查询或菜单时经常要对指定的时间或时间段进行查询,例如要查询一天内的信息,要查询一周内的信息,要查询一个月内的,南昌网站建设公…

mac电脑php中安装swoole扩展件

1.首先更新php版本&#xff0c;如果已经是最新的请忽略&#xff0c; &#xff08;1&#xff09;查看是否安装php brew search php &#xff08;2&#xff09;安装最新版本php brew install php 2.查看是否安装openssl&#xff0c;安装了请忽略 &#xff08;1&#xff09;查看…

再谈C语言指针—指向另一指针的指针

一、回顾指针概念 早在本书第贰篇中我就对指针的实质进行了阐述。今天我们又要学习一个叫做“指向另一指针地址”的指针。让我们先回顾一下指针的概念吧&#xff01;当我们程序如下声明变量&#xff1a;short int i;char a;short int * pi;程序会在内存某地址空间上为各变量开辟…

Java练习 SDUT-1586_计算组合数

计算组合数 Time Limit: 1000 ms Memory Limit: 32768 KiB Problem Description 计算组合数。C(n,m),表示从n个数中选择m个的组合数。 计算公式如下&#xff1a; 若&#xff1a;m0&#xff0c;C(n,m)1 否则&#xff0c; 若 n1&#xff0c;C(n,m)1 否则&#xff0c;若mn&#xf…

mysql日期时间操作函数详解

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 win7可以设定每周从哪一天开始&#xff0c;win2003等不能方便的修改。有的是周日开始&#xff0c;有的是周一开始。而工作中有的时候每周…

对C语言进行调试的最好方法是什么?

要了解调试程序的最好方法&#xff0c;首先要分析一下调试过程的三个要素&#xff1a;应该用什么工具调试一个程序?用什么办法才能找出程序中的错误?怎样才能从一开始就避免错误?应该用什么工具调试一个程序?有经验的程序员会使用许多工具来帮助调试程序&#xff0c;包括一…