輸入迴圈在什麼情況下結束,while(cin>>word) 型別?
最近學習了C++遇到的一個問題,Windows系統下不知道怎麼結束~
C++Primer 中,作者經常使用 while(cin>>word) 類似的語法,但是如何結束,可能會出現疑惑
好囧啊!~感覺是被作者給坑了的~
在 Unix 系統中的實際的現象為:
* 當輸入為“字串,回車,Ctrl+D”的時候,跳出迴圈;
* 當輸入為“字串,Ctrl+D,回車”的時候,不會跳出迴圈;
* 當輸入為“字串,Ctrl+D,回車,Ctrl+D”的時候,跳出迴圈;
* 當輸入為“字串,Ctrl+D,Ctrl+D”的時候,跳出迴圈;
在 Windows 系統中的實際現象待考察。
具體原因解釋如下:
輸入(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碼值,也就是說它產生的不是一個字元,所以不會跟其它從鍵盤上輸入的字元一樣能夠存放在輸入緩衝區。
結論:Windows系統中一般採用阻塞式檢查 Ctrl+Z、Unix/Linux系統下一般採用非阻塞式的檢查 Ctrl+D。