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