linux中c语言kbhit函数用法,C语言判断用户是否输入-非阻塞函数kbhit
一、基礎(chǔ)研究
要從地址讀取數(shù)據(jù),肯定是要定義一個指針變量p,用它來實(shí)現(xiàn)變換地址和取值的功能。另外程序是當(dāng)兩個條件中的某一個出現(xiàn)時(shí)才停止,所以應(yīng)該用while~do循環(huán)語句循環(huán)輸出n和d,并用while進(jìn)行判斷。這里實(shí)現(xiàn)三個問題:
(1)循環(huán)地把值轉(zhuǎn)換成地址。
(2)判斷偏移地址是否為0xffff。
(3)判斷用戶是否輸入了‘q’。
前兩個問題比較好實(shí)現(xiàn),對于第三個問題我們需要注意的是c語言是怎么處理用戶輸入的。之前做匯編課設(shè)的時(shí)候我們研究過匯編對于輸入的處理,并且嘗試過兩個中斷,一個是要中止等待用戶輸入的,一個是不中止等待的?,F(xiàn)在我們的需求就類似于第二個中斷,即等待用戶輸入同時(shí)不停止程序的運(yùn)行。
首先寫了一個程序如下:
編譯時(shí)警告說0xffff在比較中超過常量范圍,也就是超過int型的范圍,將整個程序的int改成long后警告消失。int是兩個字節(jié),應(yīng)該正好能夠容納偏移地址0xffff,為什么比較時(shí)會超出范圍呢?難道是與比較的機(jī)制有關(guān)嗎?這里作為一個問題來擴(kuò)展研究。
將編譯之后的程序進(jìn)行連接,出現(xiàn)錯誤:getchar()函數(shù)沒有定義,這說明在我們當(dāng)前連接的obj文件里沒有g(shù)etchar()函數(shù),解決的辦法有兩個:(1)用#include導(dǎo)入頭文件。(2)不使用getchar()函數(shù)。在這里我們先嘗試第二種方法,scanf()函數(shù)會暫停程序等待輸入,并且在輸入完后還要按回車才能繼續(xù)向下執(zhí)行,所以不符合我們的需求。查找資料發(fā)現(xiàn)getche()函數(shù)不用敲回車就可以將字符輸入,而getch()函數(shù)不用敲回車,也不顯示,只是將字符輸入進(jìn)行處理。而且這兩個函數(shù)也不需要導(dǎo)入其他文件,修改后的程序如下:
這時(shí)發(fā)現(xiàn)還有一個問題:每次循環(huán)都還要用戶輸入字符才能向下進(jìn)行,就是說函數(shù)是阻塞的。在網(wǎng)上查找資料發(fā)現(xiàn)輸入函數(shù)都是阻塞型的,那么我們可以調(diào)整思路,檢測用戶是否輸入。查找資料發(fā)現(xiàn)輸入檢測函數(shù)有kbhit()函數(shù),如果有輸入它會返回一個非0值,沒有就返回0,修改后的函數(shù)如下:
運(yùn)行程序,它會不停地打印地址和地址的值,直到用戶輸入字符q。
但是運(yùn)行結(jié)果發(fā)現(xiàn):當(dāng)?shù)刂窞?xffff時(shí),程序并沒有停止:
將程序改成如下所示也不行:
這里可能是判斷語句有問題,結(jié)果將判斷語句改為p==(long?*)0xffff之后程序在地址為0xffff時(shí)可以停止,修改的程序?yàn)?#xff1a;
之前是對數(shù)進(jìn)行比較,修改后是對指針進(jìn)行比較,那為什么對數(shù)進(jìn)行比較會出錯呢?我們覺得是因?yàn)閷強(qiáng)制類型轉(zhuǎn)換成long會出錯,再次修改程序如下:
發(fā)現(xiàn)雖然有警告,但是程序仍能正常執(zhí)行,這說明用long型確實(shí)會對地址判斷有影響。
二、擴(kuò)展研究
(1)int是兩個字節(jié),應(yīng)該正好能夠容納偏移地址0xffff,為什么比較時(shí)會警告超出范圍呢?
答:因?yàn)閕nt是帶正負(fù)的類型,它的最高位為符號位,而0xffff是unsigned int類型,所以會超出范圍。這里把它進(jìn)行強(qiáng)制類型轉(zhuǎn)換就行了。
(2)Getchar()的實(shí)現(xiàn)方式。
答:getchar?由宏實(shí)現(xiàn):#define?getchar()?getc(stdin)。所以要與頭文件相關(guān)聯(lián),它不是真正的函數(shù),而是定義為預(yù)處理器宏。
(3)為什么用(long)p==0xffff判斷時(shí)會識別不到0xffff,導(dǎo)致循環(huán)停不下來?
答:同樣這里應(yīng)該是unsigned long類型。
三、研究總結(jié)
c語言是接近底層的語言,這在它和匯編的聯(lián)系上可以看出來。之前做課設(shè)時(shí)要用到非阻塞中斷,在這里是用到非阻塞函數(shù),問題是相似的,只不過實(shí)現(xiàn)的語言變了。但是只要我們掌握了程序設(shè)計(jì)的精髓,其他的就只是語法上的實(shí)現(xiàn)問題了。
還有,獨(dú)立分析和思考的能力真的很重要,我們不要養(yǎng)成隨便問問題的習(xí)慣,要先自己思考,抓住問題的本質(zhì),提出自己的猜想,然后在詢問別人或者查資料去證實(shí),這樣自己解決問題的能力才能夠得到成長。
總結(jié)
以上是生活随笔為你收集整理的linux中c语言kbhit函数用法,C语言判断用户是否输入-非阻塞函数kbhit的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 时势造英雄,快影成长启示录
- 下一篇: linux下kbhit的头文件,linu