2012-09-17 65 views
0

可能重複:
Program not waiting for cincin.get()作爲期望的不正常

我寫了下面的代碼:

#include <iostream> 
using namespace std; 

void search(int pre, int a, int b, int x) { 
    char c; 
    cout << "Is the number " << ((x == 2) ? b : a) << endl; 
    c = cin.get(); ////// this does not block 
    if (c == 'y') return; 

    else { 
     cout << "Is the number " << ((x == 2) ? b : a) << " closer to your number than " << pre; 
     c = cin.get(); 

     if (c == 'y') { 
      search(a, a, (a + b)/2, 2); 
     } //c=='y' 
     else search(a, (a + b)/2, b, 1); 
    } 
} 

int main() { 
    int N; 
    cout << "Enter N? "; 
    cin >> N; 

    search(N, 1, N, 1); 
    return 0; 
} 

沒有必要,如果你擔心唐不理解邏輯,因爲我的問題不是關於這個問題的。

在搜索功能中,有兩個cin.get(),我需要用戶輸入一個字符。我的問題是程序只能在第二個cin.get()之後輸入。

例如:

Is the number 7 //program doesn't wait after this 
Is the number 7 closer to your number than 8 //program blocks here for an input 

它爲什麼這樣做呢?

+2

的問題是在你沒有顯示的代碼。寫一個簡單的程序,只是**調用這個函數。它會工作得很好。然後開始改變那個簡單的程序,加入你當前程序現在所做的事情,直到問題再次出現。然後想想你改變了什麼。 –

+2

這是一個常見的「問題」,在這個網站上搜索「cin get flush」... – Nim

+0

問題是在'cin >>'後面缺少一些東西。嘗試調用兩次函數,第一次'get'應該第二次正常工作。 – chris

回答

2

您的代碼中至少有兩個問題。首先是你輸入N後在 中留下字符。最簡單的 解決方案是在std::cin >> N;之後添加std::cin.ignore(INT_MAX, '\n'); 的呼叫;更好的解決方案(因爲它允許更多的 錯誤檢查)將使用std::getline來讀取完整的 行,然後使用std::istringstream解析它。

第二個問題是,您將 std::cin.get()的結果分配到charstd::cin.get()返回int, ,其可以是EOF。你真的要檢查它是否EOF 轉換intchar之前:你不能檢查後,因爲 或者一些法律char將相當於EOF(普通char是 簽署),或char絕不會比較等於EOF (普通char 未簽名)。另一種方法是做這樣的事情:

if (!std::cin.get(c)) { 
    // EOF or error seen... 
} 
你想讀一個 char每次

。 (這可能是在你的 情況下更好,因爲如果你做閱讀EOF,以std::cin.get() 所有後續調用將返回EOF