2012-11-21 6 views
6

का सही तरीके से उपयोग करने के लिए कैसे करें यह फ़ंक्शन एक अंश पढ़ने और उसे सरणी में रखने के लिए माना जाता है। यदि उपयोगकर्ता '0' में प्रवेश करता है तो फ़ंक्शन से बाहर निकलना चाहिए। मैं cin.peek() फ़ंक्शन का उपयोग करके ऐसा करने की कोशिश कर रहा हूं लेकिन निष्पादन हमेशा if स्टेटमेंट में जाता है और उपयोगकर्ता को बाहर निकलने की अनुमति नहीं देता है।cin.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::char_traits<char>::to_int_type() का परिणाम के खिलाफ std::istream::peek() का परिणाम तुलना, यानी, आप कुछ इस तरह का उपयोग करेंगे: std::cin.peek() == std::char_traits<char>::to_int_type('0')

जिसके अनुसार, अपने कार्यक्रम की जाँच नहीं पड़ता कि इसे सफलतापूर्वक नामजद करने पढ़ सकता है और एक स्लैश से अलग, denominator। आप हमेशा, सत्यापित करें कि पढ़ने सफल रहा था, जैसे, बस मनोरंजन के लिए की तरह

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' निष्पादन में प्रवेश करता है तो अगर कथन में प्रवेश करता है। – Zzz

+0

मैं कोड चिपका रहा हूं (प्रश्न में) जो peek() का उपयोग करके काम करता है, लेकिन मैं यह नहीं समझ सकता कि इसे मेरे उपयोग के मामले में कैसे लागू किया जाए। – Zzz

+0

क्या आपने व्हाइटस्पेस को छोड़ना जोड़ा, यानी, यह छोटा 'std :: ws' बिट? मैं यह शर्त लगाने के लिए तैयार हूं कि परीक्षण में जो चरित्र आप देखते हैं वह कुछ प्रकार की जगह है, अधिकतर एक नई लाइन। –

संबंधित मुद्दे