怎樣在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.pswp.cn/news/450600.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/450600.shtml
英文地址,請注明出處:http://en.pswp.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;包括一…