2012-11-21 224 views
6

該函數應該讀取一個分數並將其放入數組中。如果用戶輸入'0',則該功能應該退出。我正在嘗試使用cin.peek()函數來執行此操作,但執行通常會進入if語句並且不允許用戶退出。如何正確使用cin.peek()

我應該如何正確地編寫這(我願意不使用PEEK(),我認爲這是做的最簡單的方法。)

謝謝!然而

void enterFrac(Fraction* fracs[], int& index) 
    { 
     int n, d; 
     char c, slash; 
     cout << "Enter fractions (end by entering a 0): "; 
     c = cin.peek(); 

     if (c != '0') 
     { 
      cin >> n >> slash >> d; 
      Fraction* f = new Fraction(); 
      f->num = n; 
      f->den = d; 
      fracs[index] = f; 
      index++; 
     } 
    } 

偷看的這種測試()的工作原理:

#include <iostream> 
using namespace std; 

int main() { 
    char c; 
    int n; 
    char str[256]; 

    cout << "Enter a number or a word: "; 
    c=cin.peek(); 

    if ((c >= '0') && (c <= '9')) 
    { 
    cin >> n; 
    cout << "You have entered number " << n << endl; 
    } 
    else 
    { 
    cin >> str; 
    cout << " You have entered word " << str << endl; 
    } 

    return 0; 
} 
+0

我添加了一個案例,我可以讓peek()正常工作,但我沒有看到是什麼原因導致了我的情況。 – Zzz

回答

11

有與您使用的std::istream::peek()兩個問題:

  1. 此功能訪問下一個字符,確實跳過主要的空白。在確定下一個字符是什麼之前,您可能想跳過前導空格,例如使用操縱器std::ws(std::cin >> std::ws).peek()
  2. std::istream::peek()的結果不是char。相反,它是一個std::char_traits<char>::int_type(這是一個奇怪的拼寫int)。結果可能是,例如,std::char_traits<char>::eof(),如果'0'的值恰好是負數(我不知道任何平臺在哪裏;但是,例如,我的名字'ü'中的有趣字符在平臺上爲負值,其中char被簽名),你也不會得到正確的結果。也就是說,你通常比較結果std::istream::peek()反對std::char_traits<char>::to_int_type()的結果,即,你會使用這樣的:std::cin.peek() == std::char_traits<char>::to_int_type('0')

這就是說,你的程序不檢查它是否可以成功地讀取提名者和分母,斜線分隔。您總是要驗證讀書是成功的,例如,使用類似

if ((std::cin >> nominator >> slash >> denominator) && slash == '/') { 
    ... 
} 

只是爲了娛樂,你可以創建一個機械手進行測試,一個字符是一斜線,確實:

std::istream& slash(std::istream& in) { 
    if ((in >> std::ws).peek() != std::char_traits<char>::to_int_type('/')) { 
     in.setstate(std::ios_base::failbit); 
    } 
    return in; 
} 

這樣,你可以封裝斜線測試。如果你需要在多個地方使用它,這是非常方便的。

+0

這真的是有用的信息,但我仍然留下相同的問題,除非我不明白你的解釋中的某些內容:)。當用戶輸入'0'時,執行輸入if語句。 – Zzz

+0

我粘貼使用peek()的代碼(在問題中),但我無法弄清楚如何在我的用例中應用它。 – Zzz

+0

您是否添加了空格跳過,即這個小小的'std :: ws'位?我準備打賭你在測試中看到的角色是某種空間,很可能是換行符。 –