談一談getchar EOF和Ctrl D

2021-07-03 17:51:45 字數 1922 閱讀 3001

1、

#include

int main()

printf("end:%d\n",a);

return

0;}

下面是幾種不同情況下的輸出:

(1)直接按ctrl+d後,getchar()返回-1,退出

(2)輸入一串字元後,再按ctrl+d

所有字元被從緩衝區讀出,與按回車不同的是,回車也會被送入緩衝,但ctrl+d沒有在緩衝區中體現出來。本來想,如同(1)一樣,ctrl+d相當於eof(-1),在輸出所有字元後,getchar()會遇到eof輸出-1的。

(3)輸入一串字元後,連續按兩次ctrl+d

最後會得到-1,退出迴圈。

既然getchar()是從緩衝區中讀字元,而根據(2)ctrl+d是沒有放入緩衝區的,為什麼按兩次ctrl+d就會輸出-1呢?

在網上查到的解釋如下:

輸入緩衝是行緩衝。當從鍵盤上輸入一串字元並按回車後,這些字元會首先被送到輸入緩衝區中儲存。每當按下回車鍵後,就會檢測輸入緩衝區中是否有了可讀的資料。還會對鍵盤上是否有作為流結束標誌的 ctrl+z(windows) 或者 ctrl+d 鍵 按下作出檢查,其檢查的方式有兩種:阻塞式以及非阻塞式。

阻塞式檢查方式指的是只有在回車鍵按下之後才對此前是否有 ctrl+z 組合鍵按下進行檢查,非阻塞式樣指的是按下 ctrl+ d 之後立即響應的方式。如果在按 ctrl+d 之前已經從鍵盤輸入了字元,則 ctrl+d的作用就相當於回車(但是回車自己也會進入緩衝),即把這些字元送到輸 入緩衝區供讀取使用,此時ctrl+d不再起流結束符的作用。如果按 ctrl+d 之前沒有任何鍵盤輸入,則 ctrl+d 就是流結束的訊號。

windows系統中一般採用阻塞式檢查 ctrl+z、unix/linux系統下一般採用非阻塞式的檢查 ctrl+d。樓主是在windows系統下,因此使用阻塞式的 ctrl+z 來標識流的結束。這種阻塞式的方式有乙個特點:只有按下回車之後才有可能檢測在此之前是否有ctrl+z按下。還有乙個特點就是:如果輸入緩衝區中有可讀的資料則不會 檢測ctrl+z(因為有要讀的資料,還不能認為到了流的末尾)。還有一點需要知道:ctrl+z產生的不是乙個普通的ascii碼值,也就是說它產生的 不是乙個字元,所以不會跟其它從鍵盤上輸入的字元一樣能夠存放在輸入緩衝區。

[摘自:

2、

#include

int main()

printf("end:%d\n",a);

return

0;}

在緩衝區字元沒讀完的時候按ctrl+d

結果在輸出所有字元後,getchar()返回了-1,說明只要沒有鍵盤輸入,直接ctrl+d就會起作用。

我覺得可以這樣理解,每按一次ctrl+d就表示結束一輪輸入,此時ctrl+d就告訴getchar()你去讀緩衝區吧。當ctrl+d之前有字元輸入時,getchar就會正常讀到字元。當直接按ctrl+d時,緩衝區沒有任何字元送進去,getchar()去讀的時候什麼也沒讀到,就會出錯返回-1。 3、

#include 

#include

int main(void)

/* 終端驅動處又回到一次一行模式 */

system("stty cooked");

return

0;}

stty raw 可以實現鍵入乙個字元立即讀出的效果。此時回車不再起換行作用,按回車後游標會定位到行開頭。

C 談一談this指標

當你進入乙個 房子 後,你可以看見桌子 椅子 地板等,但是房子你是看不到全貌了。對於乙個類的例項來說,你可以看到它的 成員函式 成員變數 但是例項本身呢?this是乙個 指標 它時時刻刻指向你這個 例項 本身class date void printdate 結果如下 進過反彙編,我們知道了 ecx...

談一談C 的事件

c 中事件基於委託,要理解事件要先理解委託,如果覺得自己關於委託不是很了解可以看看我前面寫委託的文章 使用委託時,一般會出現兩種角色 廣播者 發布者 和訂閱者,這是乙個非常常見的模型 using system class program 定義 發布 委託 public delegate void p...

談一談教育

今晚和研究生的師兄聊了會天,突然就說到教育的問題,有點感想,就寫下來,算是我對中國教育的一點看法吧。毫無疑問,中國的教育體制存在不少問題。在高中的時候或許還不是那麼明顯 對比起大學來說 上了大學,我才看清了我們教育的一些弊端。我覺得,最大的弊端,在於價值觀的引導問題上。不知道大家有沒和我一樣覺得當今...