2012-11-21 18 views
6

Bu işlev bir kesir okumalı ve bir diziye yerleştirilmelidir. Kullanıcı '0' girerse, fonksiyonun çıkması gerekir. Bunu cin.peek() işlevini kullanarak yapmaya çalışıyorum ancak yürütme her zaman if deyimine gider ve kullanıcının çıkmasına izin vermez.Uygun şekilde nasıl kullanılır cin.peek()

düzgün bu kodu nasıl olmalıdır (I() göz kullanmayan açığım, ben bunu yapmanın en basit yolu olduğunu düşünüyorum.)

Teşekkür!

#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

Uygun bir şekilde çalışması için peek() yöntemini alabileceğim bir durum ekledim, ancak durumumda sorunun nedenini göremiyorum. – Zzz

cevap

11

std::istream::peek() kullanımınız ile iki sorunu vardır:

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++; 
     } 
    } 

peek Bu test() ancak çalışır

  1. Bu fonksiyon erişim sonraki karakter ve does değil önde gelen boşlukları atla. Muhtemelen, bir sonraki karakterin ne olduğunu belirlemeye başlamadan önce beyaz boşlukları atlamak istersiniz, örneğin, std::ws: (std::cin >> std::ws).peek() manipülatörünü kullanarak.
  2. std::istream::peek() sonucu, char değil. Bunun yerine, std::char_traits<char>::int_type (int'un süslü bir yazımıdır). Sonuç, örneğin, std::char_traits<char>::eof() olabilir ve '0' değeri negatif olduğunda (herhangi bir platformun farkında değilsem); ancak, örneğin, 'ü' ismimden gelen komik karakter char numaralı platformlarda negatif bir değerdir imzalı) doğru sonucu elde edemezsiniz. Yani normalde, yani böyle bir şey kullanmak istiyorum std::char_traits<char>::to_int_type() sonucu karşı std::istream::peek() sonucunu karşılaştırmak şöyledir: adı geçen std::cin.peek() == std::char_traits<char>::to_int_type('0')

, programınız başarıyla nominator okuyabilir olup olmadığını kontrol etmez ve payda ile ayrılmış payda. Sen hep gerçekten, örneğin, sadece eğlence için

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

gibi bir şey kullanarak, bir bölü karakteri o test için bir manipülatör oluşturabilir, bu okuma başarılı olduğunu doğrulamak istiyorum:

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; 
} 

Bu şekilde, slash için testi kaplarsınız. Bunu birden fazla yerde kullanmanız gerekiyorsa, bu oldukça kullanışlıdır.

+0

Bu gerçekten yararlı bir bilgidir, ancak açıklamada bir şey anlamadığım sürece hala aynı sorunla uğraşıyorum :). Kullanıcı '0' girdiğinde yürütme if ifadesine girer. – Zzz

+0

Peek() işlevini kullanan kod (söz konusu) yapıştırıyorum, ancak kullanım durumumda nasıl uygulanacağımı anlayamıyorum. – Zzz

+0

Beyaz boşluğun atlamasını eklediniz mi, yani, bu küçük 'std :: ws' bit mi? Testte gördüğünüz karakterin bir çeşit boşluk, büyük olasılıkla yeni bir satır olduğu konusunda bahse girerim. –