2010-07-18 18 views
15

मैं कैसे जांचूँगा कि इनपुट वास्तव में एक डबल है या नहीं?मैं उपयोगकर्ता इनपुट को C++ में डबल के रूप में कैसे मान्य करूं?

double x; 

while (1) { 
    cout << '>'; 
    if (cin >> x) { 
     // valid number 
     break; 
    } else { 
     // not a valid number 
     cout << "Invalid Input! Please input a numerical value." << endl; 
    } 
} 
//do other stuff... 

ऊपर कोड असीम Invalid Input! बयान आउटपुट, इसलिए इसकी एक और इनपुट के लिए उत्साह नहीं। मैं इनपुट के लिए संकेत देना चाहता हूं, जांचें कि यह वैध है या नहीं ... यदि यह एक डबल है, तो आगे बढ़ें ... यदि यह दो बार नहीं है, तो फिर से संकेत दें।

कोई विचार?

+0

स्वरूपण गाइड पर अगली बार देखने के लिए आप एक पोस्ट बनाने सुनिश्चित करें। धन्यवाद। – strager

+0

आपका क्या मतलब है? प्रारूपण में क्या गलत है? – Hristo

+0

मैंने आपकी पोस्ट संपादित की, लेकिन संपादन से पहले कोड स्वरूपित नहीं किया गया था। मूल पोस्ट देखने के लिए "संपादित एन मिनट पहले" पर क्लिक करें। – strager

उत्तर

14

इस प्रयास करें:

while (1) { 
    if (cin >> x) { 
     // valid number 
     break; 
    } else { 
     // not a valid number 
     cout << "Invalid Input! Please input a numerical value." << endl; 
     cin.clear(); 
     while (cin.get() != '\n') ; // empty loop 
    } 
} 

यह मूल रूप से, त्रुटि राज्य को साफ करता है तो पढ़ता है और सब कुछ है कि पिछले लाइन पर दर्ज किया गया था छोड़ देता है।

+0

यह 'जबकि (1) 'लूप के अंदर है? – Hristo

+0

हां, आपके मौजूदा पाश के अंदर। मैंने अभी भी आंतरिक भाग को पुन: उत्पन्न किया है। – casablanca

+0

ठीक है कि काम करता है। क्या आप खाली पाश के पीछे तर्क समझा सकते हैं? वहां वास्तव में क्या चल रहा है? 'Get()' क्या करता है? – Hristo

-3

मैं cin के बजाय scanf का उपयोग करूंगा।

scanf फ़ंक्शन लक्ष्य स्ट्रिंग से मिलानों की संख्या वापस कर देगा। सुनिश्चित करने के लिए एक वैध डबल पार्स किया गया था, यह सुनिश्चित कर लें scanf की वापसी मान है 1.

संपादित करें:
scanf में बदला गया fscanf

+0

मैं कमांड लाइन से पढ़ना चाहता हूं ... 'FILE' से पढ़ने के लिए' fscanf' नहीं है? – Hristo

+0

सवाल यह है कि 'cin' का उपयोग करके इसे कैसे किया जाए। – casablanca

+0

'scanf' समान कार्यक्षमता प्रदान करेगा, सिवाय इसके कि एक मनमानी फ़ाइल ऑब्जेक्ट के बजाय 'stdin' से पढ़ा जाएगा। – advait

1

failbit एक पार्स त्रुटि होने पर निष्कर्षण ऑपरेटर का उपयोग करने के बाद सेट किया जाएगा, कुछ सरल परीक्षण फ़ंक्शन good और fail आप देख सकते हैं। वे बिल्कुल एक-दूसरे के विपरीत हैं क्योंकि वे eofbit को अलग-अलग संभालते हैं, लेकिन यह इस उदाहरण में कोई समस्या नहीं है।

फिर, आपको फिर से प्रयास करने से पहले failbit साफ़ करना होगा।

कैसाब्लांका के अनुसार, आपको इनपुट बफर में अभी भी छोड़े गए गैर-संख्यात्मक डेटा को छोड़ना होगा।

तो:

double x; 

while (1) { 
    cout << '>'; 
    cin >> x; 
    if (cin.good()) 
     // valid number 
     break; 
    } else { 
     // not a valid number 
     cout << "Invalid Input! Please input a numerical value." << endl; 
     cin.clear(); 
     cin.ignore(100000, '\n'); 
    } 
} 
//do other stuff... 
+0

टैग किया गया है यह अभी भी अनंत अमान्य 'प्रिंट' प्रिंट करने के लिए अनंत लूप का कारण बन रहा है ... यह किसी अन्य इनपुट के लिए संकेत नहीं दे रहा है। – Hristo

+0

'cin.ignore()' क्या करता है? – Hristo

+0

कैसाब्लांका के लूप के समान ही चीज, यह सभी पात्रों को फेंकता है और जो भी गैर-संख्यात्मक डेटा से छुटकारा पाने के लिए नई लाइन को शामिल करता है, वह पहला निष्कर्षण विफल हो जाता है। –

0

फ़्लोटिंग संख्या समानता की जांच करना एक तरीका है।

double x; 

while (1) { 
    cout << '>'; 
    cin >> x; 
    if (x != int(x)) { 
     // valid number 
     break; 
    } else { 
     // not a valid number 
     cout << "Invalid Input! Please input a numerical value." << endl; 
    } 
} 
+0

इस प्रकार की जांच 'डबल'' के लिए कैसे होती है? – Hristo

+0

यह सिर्फ जांच करता है कि इनपुट में एक आंशिक हिस्सा था, जो संभवत: प्रश्न से नहीं था। –

+0

हाँ, हम में से ज्यादातर जानते हैं कि हिस्टो का क्या अर्थ था लेकिन यह जवाब उन प्रश्नों को संबोधित करता है जो उन्होंने पूछा: "मैं कैसे जांच करूंगा कि इनपुट वास्तव में एक डबल है या नहीं?" इस बारे में व्याख्या करते हुए, "मुझे लगता है कि मुझे संख्या मिल रही है, मैं कैसे सुनिश्चित करूं कि वे पूरी संख्या नहीं हैं?" यह एक पूरी तरह से उपयोगी जवाब बनाता है। डाउनवोट करने की कोई ज़रूरत नहीं है, इमो। – chaosTechnician

0
#include <iostream> 
#include <string> 

bool askForDouble(char const *question, double &ret) 
{ 
     using namespace std; 
     while(true) 
     { 
       cout << question << flush; 
       cin >> ret; 
       if(cin.good()) 
       { 
         return true; 
       } 
       if(cin.eof()) 
       { 
         return false; 
       } 
       // (cin.fail() || cin.bad()) is true here 
       cin.clear(); // clear state flags 
       string dummy; 
       cin >> dummy; // discard a word 
     } 
} 

int main() 
{ 
     double x; 
     if(askForDouble("Give me a floating point number! ",x)) 
     { 
       std::cout << "The double of it is: " << (x*2) << std::endl; 
     } else 
     { 
       std::cerr << "END OF INPUT" << std::endl; 
     } 
     return 0; 
} 
+1

इनपुट सत्यापन करना एक आसान काम होना चाहिए था। यह नए लोगों को सिखाना और उन्हें जो कुछ भी कर रहा है उसका आनंद लेने में मदद करता है। मैं नए लोगों के लिए सीन और कॉउट पर बुलेटप्रूफ और अभी भी उपयोगी ट्यूटोरियल देखना चाहता हूं। – Notinlist

0
bool is_double(double val) 
{ 
bool answer; 
double chk; 
int double_equl = 0;  
double strdouble = 0.0; 
strdouble = val;   
double_equl = (int)val; 
chk = double_equl/strdouble; 
if (chk == 1.00) 
{ 
answer = false; // val is integer 
return answer; 
} else { 
answer = true; // val is double 
return answer; 
} 
}