2014-11-22 77 views
1

大家好,所以我讀了std :: cin.get()func並閱讀我們用它來捕獲輸入任何輸入後輸入的換行符char安慰。但是當我編寫一個非常基本的小程序時,我很困惑,並且無法理解它的行爲。試圖瞭解std :: cin.get()

所以我的程序是用於C++ primer plus的練習。不管怎樣的代碼如下:

#include <iostream> 
#include <cstring> 

void countWords() { 
    char word [100]; 
    char wordDone [] = "done"; 
    int count = 0; 

    std::cout << "Enter words (to stop, type the word done): \n"; 
    std::cin >> word; 

    while (strcmp(word, wordDone) != 0) { 
    std::cin >> word; 
    count += 1; 
    } 

    std::cout << "You entered a total of " << count << " words."; 

    std::cin.get(); 
    std::cin.get(); 
} 

int main() { 
    countWords(); 

    std::cin.get(); 
    return 0; 
} 

現在,這裏的問題是,當我運行上面的代碼,屏幕上給了我正確的輸出,但它消失,不用等我進入回報。

但是,當不是創建上述countWords()函數時,如果我在main()函數中編寫了整個代碼,它完美地工作,這就是令我困惑的東西。

根據我的理解,當我在控制檯中輸入char數組並按回車時,緩衝區將控制檯數據和換行符保存在隊列中,while循環處理完畢並顯示cout後,返回被吸收由第一個std :: cin.get()。那麼程序應該等待我輸入另一個返回值,然後再由第二個cin.get()來吸取它,並且它也應該問我另一個返回值,因爲main函數中也有一個cin.get()。但由於某些原因,我無法弄清楚,輸出屏幕就會消失。

有什麼意見或解釋?

+0

你應該只需要按兩次回車鍵,根據你所描述的。 – 2014-11-22 19:05:44

回答

2

看起來你有東西卡在緩衝區中,導致你的所有get s被填充。

我建議如下:

cin.ignore(-1, '\n'); 
+0

'sync()'的效果是實現定義的。試試'std :: cin.ignore(-1,'\ n')'這是一種更符合標準的丟棄字符的方式。 – 0x499602D2 2014-11-22 19:14:09

-2

cin.get()將返回EOF,如果有流中沒有可用的字符,並設置流的failbit。我懷疑這是發生了什麼,所以你的程序將只是通過你所有的cin.gets,而不是等待另一個返回字符。

爲了澄清關於如何的IStream ::獲得作品: istream::get

+1

+ -1:如果流已經達到文件結束,'cin.get()'將返回EOF,除非您鍵入Ctrl + D(或您的終端的等效參數),否則標準輸入不會出現此結果。這與流緩衝區中有多少可用字符無關(_buffer_,不是「在流中」:流不是容器,而是數據流)。 – 2014-11-22 21:56:47