c語言判斷使用者是否輸入 非阻塞函式kbhit

2022-03-30 22:36:12 字數 2047 閱讀 7874

要從位址讀取資料,肯定是要定義乙個指標變數p,用它來實現變換位址和取值的功能。另外程式是當兩個條件中的某乙個出現時才停止,所以應該用while~do迴圈語句迴圈輸出n和d,並用while進行判斷。這裡實現三個問題:

(1)迴圈地把值轉換成位址。

(2)判斷偏移位址是否為0xffff。

(3)判斷使用者是否輸入了『q』。

前兩個問題比較好實現,對於第三個問題我們需要注意的是c語言是怎麼處理使用者輸入的。之前做彙編課設的時候我們研究過彙編對於輸入的處理,並且嘗試過兩個中斷,乙個是要中止等待使用者輸入的,乙個是不中止等待的。現在我們的需求就類似於第二個中斷,即等待使用者輸入同時不停止程式的執行。

首先寫了乙個程式如下:

編譯時警告說0xffff在比較中超過常量範圍,也就是超過int型的範圍,將整個程式的int改成long後警告消失。int是兩個位元組,應該正好能夠容納偏移位址0xffff,為什麼比較時會超出範圍呢?難道是與比較的機制有關嗎?這裡作為乙個問題來擴充套件研究。

將編譯之後的程式進行連線,出現錯誤:getchar()函式沒有定義,這說明在我們當前連線的obj檔案裡沒有getchar()函式,解決的辦法有兩個:(1)用#include匯入標頭檔案。(2)不使用getchar()函式。在這裡我們先嘗試第二種方法,scanf()函式會暫停程式等待輸入,並且在輸入完後還要按回車才能繼續向下執行,所以不符合我們的需求。查詢資料發現getche()函式不用敲回車就可以將字元輸入,而getch()函式不用敲回車,也不顯示,只是將字元輸入進行處理。而且這兩個函式也不需要匯入其他檔案,修改後的程式如下:

這時發現還有乙個問題:每次迴圈都還要使用者輸入字元才能向下進行,就是說函式是阻塞的。在網上查詢資料發現輸入函式都是阻塞型的,那麼我們可以調整思路,檢測使用者是否輸入。查詢資料發現輸入檢測函式有kbhit()函式,如果有輸入它會返回乙個非0值,沒有就返回0,修改後的函式如下:

執行程式,它會不停地列印位址和位址的值,直到使用者輸入字元q。

將程式改成如下所示也不行:

之前是對數進行比較,修改後是對指標進行比較,那為什麼對數進行比較會出錯呢?我們覺得是因為將p強制型別轉換成long會出錯,再次修改程式如下:

發現雖然有警告,但是程式仍能正常執行,這說明用long型確實會對位址判斷有影響。

(1)int是兩個位元組,應該正好能夠容納偏移位址0xffff,為什麼比較時會警告超出範圍呢?

答:因為int是帶正負的型別,它的最高位為符號位,而0xffff是unsigned int型別,所以會超出範圍。這裡把它進行強制型別轉換就行了。

(2)getchar()的實現方式。

(3)為什麼用(long)p==0xffff判斷時會識別不到0xffff,導致迴圈停不下來?

答:同樣這裡應該是unsigned long型別。

c語言是接近底層的語言,這在它和彙編的聯絡上可以看出來。之前做課設時要用到非阻塞中斷,在這裡是用到非阻塞函式,問題是相似的,只不過實現的語言變了。但是只要我們掌握了程式設計的精髓,其他的就只是語法上的實現問題了。

還有,獨立分析和思考的能力真的很重要,我們不要養成隨便問問題的習慣,要先自己思考,抓住問題的本質,提出自己的猜想,然後在詢問別人或者查資料去證實,這樣自己解決問題的能力才能夠得到成長。

C 判斷使用者輸入是否為數字?

include include include using namespace std bool is number string str return true else return true void main int a 0 const char s cout 請輸入資料a string s...

C 語言怎麼判斷輸入是否數字 或者字母?

寫程式的時候常常需要用到使用者輸入,但是如何判斷輸入是否為數字,字母?其中怎麼判斷使用者輸入的數字,字母?假設用char ch是接收到的使用者輸入的單個字元。判斷字母 寫字母 if ch a ch z 寫字母 if ch a ch z 字母 包含寫 if ch a ch z ch a ch z 判斷...

C語言非阻塞式鍵盤監聽

所謂鍵盤監聽,就是使用者按下某個鍵時系統做出相應的處理,本章講到的輸入輸出函式也是鍵盤監聽函式的一種,例如 getchar getche getch 等。下面的 演示了 getch 函式的使用 include include int main else return 0 這段 雖然達到了監聽鍵盤的目...