2010-01-16 12 views
13

का उपयोग कर अच्छा इनपुट सत्यापन लूप, मैं अपनी दूसरी ओओपी कक्षा में हूं, और मेरी पहली कक्षा सी # में पढ़ाया गया था, इसलिए मैं सी ++ में नया हूं और वर्तमान में मैं सिने का उपयोग करके इनपुट सत्यापन का अभ्यास कर रहा हूं। तो यहां मेरा प्रश्न है:सीआई - सी ++

क्या यह लूप मैंने इनपुट को वैध करने का एक अच्छा अच्छा तरीका बनाया है? या क्या ऐसा करने का एक और आम/स्वीकार्य तरीका है?

धन्यवाद!

कोड:

int taxableIncome; 
int error; 

// input validation loop 
do 
{ 
    error = 0; 
    cout << "Please enter in your taxable income: "; 
    cin >> taxableIncome; 
    if (cin.fail()) 
    { 
     cout << "Please enter a valid integer" << endl; 
     error = 1; 
     cin.clear(); 
     cin.ignore(80, '\n'); 
    } 
}while(error == 1); 

उत्तर

23

मैं iostreams के लिए अपवाद को चालू करने का एक बहुत बड़ा प्रशंसक नहीं हूँ। I/O त्रुटियां पर्याप्त असाधारण नहीं हैं, उस त्रुटियों में अक्सर बहुत संभावना होती है। मैं केवल कम त्रुटि की स्थिति के लिए अपवादों का उपयोग करना पसंद करता हूं।

कोड खराब नहीं है, लेकिन 80 अक्षरों को छोड़ना थोड़ा मनमाना है, और अगर आप लूप के साथ परेशान होते हैं तो त्रुटि चर आवश्यक नहीं है (और यदि आप इसे रखते हैं तो bool होना चाहिए)। आप cin से सीधे if पर पढ़ सकते हैं, जो शायद एक पर्ल मुहावरे से अधिक है।

int taxableIncome; 

for (;;) { 
    cout << "Please enter in your taxable income: "; 
    if (cin >> taxableIncome) { 
     break; 
    } else { 
     cout << "Please enter a valid integer" << endl; 
     cin.clear(); 
     cin.ignore(numeric_limits<streamsize>::max(), '\n'); 
    } 
} 
केवल 80 अक्षर लंघन से

अलावा, ये केवल मामूली quibbles हैं, और अधिक पसंदीदा शैली की बात कर रहे हैं:

यहाँ मेरी ले रहा है।

+0

धन्यवाद, यह जो कुछ मैं ढूंढ रहा था उसके आधार पर यह और अधिक है। बहुत सराहना की। एक प्रश्न हालांकि, लूप स्थिति (;;) के लिए क्या है? समझ में नहीं आता – Alex

+2

@Alex - 'foo (;;) 'का मतलब है हमेशा के लिए लूप,' जबकि (1)' की तरह। यदि आप नहीं चाहते हैं कि आपका लूप हमेशा के लिए लूप को हमेशा के लिए लूप करे, तो आपको लूप को समाप्त करने के लिए कहीं भी 'ब्रेक' की आवश्यकता है। –

+0

मुझे आमतौर पर इस तरह के मामले में (! Eof (stdin)) होता है, अगर इनपुट खो जाता है तो कोड पागल हो जाता है ... या क्या यह अपवाद फेंक देगा? – PypeBros

3

आप नहीं की कोशिश/पकड़, बस पाने के लिए आप अपवाद संचालन की अवधारणा के लिए इस्तेमाल किया पर विचार हो सकता?

यदि नहीं, तो 0 और 1 के बजाय बुलियन का उपयोग क्यों न करें? सही प्रकार की वैरिएबल का उपयोग करने की आदत में (और जहां जरूरत बनाने प्रकार के)

Cin.fail() भी http://www.cplusplus.com/forum/beginner/2957/

वास्तव में, कई स्थानों में पर चर्चा की है ...

जाओ http://www.google.com.sg/#hl=en&source=hp&q=c%2B%2B+tutorial&btnG=Google+Search&meta=&aq=f&oq=c%2B%2B+tutorial

आप उनमें से कुछ का अध्ययन कर सकते हैं और स्पष्टीकरण का पालन करने का प्रयास क्यों कर सकते हैं कि चीजों को एक निश्चित तरीके से क्यों किया जाना चाहिए।

लेकिन, अभी या बाद में, आप अपवाद को समझने के लिए चाहिए ...

2

एक मामूली वक्रोक्ति कि त्रुटि सहायक चर पूरी तरह से बेमानी है और की जरूरत नहीं है है:

do 
{ 
    cin.clear(); 
    cout << "Please enter in your taxable income: "; 
    cin >> taxableIncome; 
    if (cin.fail()) 
    { 
     cout << "Please enter a valid integer" << endl; 
     cin.ignore(80, '\n'); 
    } 
}while(cin.fail()); 
4
int taxableIncome; 
string strInput = ""; 
cout << "Please enter in your taxable income:\n"; 

while (true) 
{ 
    getline(cin, strInput); 

    // This code converts from string to number safely. 
    stringstream myStream(strInput); 
    if ((myStream >> taxableIncome)) 
     break; 
    cout << "Invalid input, please try again" << endl; 
} 

तो आप देख मैं इनपुट के लिए स्ट्रिंग का उपयोग करें और फिर एक पूर्णांक है कि परिवर्तित। इस तरह, कोई एंटर टाइप कर सकता है, 'मिकी माउस' या जो भी हो और यह अभी भी जवाब देगा।
इसके अलावा # शामिल करें <string> और <sstream>

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