while(cin>>word)在什麼時候結束此迴圈的問題
在c++程式設計中我們難免會遇到這種問題就是,當 使用while(cin>>word)這種迴圈時,編譯執行往往會出現迴圈不能終止的狀況,所以我們有了不知道如何結束這種迴圈的疑惑。
在 Unix 系統中的實際的現象為:
* 當輸入為“字串,回車,Ctrl+D”的時候,跳出迴圈;
* 當輸入為“字串,Ctrl+D,回車”的時候,不會跳出迴圈;
* 當輸入為“字串,Ctrl+D,回車,Ctrl+D”的時候,跳出迴圈;
* 當輸入為“字串,Ctrl+D,Ctrl+D”的時候,跳出迴圈;
--------------------- 本文來自 MISAYAONE 的CSDN 部落格
具體原因解釋如下:
輸入(cin)緩衝是行緩衝。當從鍵盤上輸入一串字元並按回車後,這些字元會首先被送到輸入緩衝區中儲存。每當按下回車鍵後,cin 就會檢測輸入緩衝區中是否有了可讀的資料。
cin 還會對鍵盤上是否有作為流結束標誌的 Ctrl+Z 或者 Ctrl+D 鍵按下作出檢查,其檢查的方式有兩種:阻塞式以及非阻塞式。 阻塞式檢查方式指的是隻有在回車鍵按下之後才對此前是否有 Ctrl+Z 組合鍵按下進行檢查,非阻塞式樣指的是按下 Ctrl+D 之後立即響應的方式。如果在按 Ctrl+D 之前已經從鍵盤輸入了字元,則 Ctrl+D的作用就相當於回車,即把這些字元送到輸入緩衝區供讀取使用,此時Ctrl+D不再起流結束符的作用。如果按 Ctrl+D 之前沒有任何鍵盤輸入,則 Ctrl+D 就是流結束的訊號。
阻塞式的方式有一個特點:只有按下回車之後才有可能檢測在此之前是否有Ctrl+Z按下。還有一個特點,如果輸入緩衝區中有可讀的資料則不會檢測 Ctrl+Z(因為有要讀的資料,還不能認為到了流的末尾)。還有一點需要知道,Ctrl+Z產生的不是一個普通的ASCII碼值,也就是說它產生的不是一個字元,所以不會跟其它從鍵盤上輸入的字元一樣能夠存放在輸入緩衝區。
window系統一般採取阻塞式檢查所以如果出現上述情況則採用Ctrl+Z的方式來結束迴圈。
具體什麼意思我只能瞭解一個大概,不能深入瞭解,所等以後知識豐富了,再來更新此篇微博。
謝謝!