2009-02-05 13 views
6

मान्य करने के लिए कैसे करें मैं std::cin का उपयोग कर हस्ताक्षरित दशमलव पर इनपुट मान को सीमित करने के बारे में जानना चाहता हूं।संख्यात्मक इनपुट सी ++

उत्तर

2
double i; 

//Reading the value 
cin >> i; 

//Numeric input validation 
if(!cin.eof()) 
{ 
    peeked = cin.peek(); 
    if(peeked == 10 && cin.good()) 
    { 
      //Good! 
      count << "i is a decimal"; 
     } 
     else 
     { 
      count << "i is not a decimal"; 
     cin.clear(); 
     cin >> discard; 
     } 
} 

यह इनपुट -1 ए 2.0 के साथ एक त्रुटि संदेश देता है जो केवल -1 से असाइनमेंट से परहेज करता है।

+1

# 1: 'त्यागें' क्या है? # 2: क्यों '10'? मैक के बारे में क्या? # 3: आप पुनः प्रयास करने के लिए लूप कैसे बनाते हैं? जब आप इसे लिखते हैं तो इनपुट 'ddd' 'आज़माएं। आपको कई बार आपकी त्रुटियां मिलेंगी। यदि नहीं, तो मैं वास्तव में आपके समाधान के बारे में उत्सुक हूँ। – Notinlist

11

cin के समर्थन चर एक संख्या है, और प्रदान की स्ट्रिंग एक नंबर नहीं है, तो वापसी मान तो आप एक पाश की जरूरत है, गलत है:

int someVal; 

while(!(cin >> someVal)) { 
    cin.reset(); 
    cout << "Invalid value, try again."; 
} 
+8

play.cpp: 10: त्रुटि: 'struct std :: IStream' कोई भी सदस्य नामित किया गया है 'रीसेट' – Ziggy

+5

और यह भी - अगर मैं रीसेट की जगह() स्पष्ट() के साथ, जिसका अर्थ है या नहीं - यह गैर-संख्यात्मक इनपुट दिए जाने पर अनंत लूप की ओर जाता है। – Notinlist

-5

कुछ की तरह:

double a; 
cin >> a; 

अपने हस्ताक्षरित "दशमलव" जुर्माना पढ़ना चाहिए।

आपको एक लूप और कुछ कोड की आवश्यकता होगी ताकि यह सुनिश्चित किया जा सके कि यह एक समझदार तरीके से अमान्य इनपुट को संभालता है।

गुड लक!

1

सीन का >> ऑपरेटर एक समय में एक चरित्र को पढ़कर काम करता है जब तक वह सफेद जगह पर नहीं जाता। यह पूरे स्ट्रिंग -1a2.0 को स्लर्प करेगा, जो स्पष्ट रूप से एक संख्या नहीं है इसलिए ऑपरेशन विफल हो जाता है। ऐसा लगता है कि वास्तव में आपके पास तीन फ़ील्ड हैं, -1, ए, और 2.0। यदि आप व्हाइटस्पेस द्वारा डेटा को अलग करते हैं, तो सीन बिना किसी समस्या के प्रत्येक को पढ़ने में सक्षम होगा। दूसरे क्षेत्र के लिए char पढ़ने के लिए बस याद रखें।

0

मैं कठोर होने की कोशिश नहीं कर रहा हूं। मैं सिर्फ एक समाधान साझा करना चाहता था जो मैंने प्रदान किया है जो मुझे विश्वास है कि यह अधिक मजबूत है और बेहतर इनपुट सत्यापन के लिए अनुमति देता है।

देखें करने के लिए: My Solution to Input Validation

0

मैं >> ऑपरेटर का उपयोग उपयोगकर्ता से पूर्णांक इनपुट को पढ़ने के लिए कई तकनीकों कोशिश की, लेकिन एक तरह से या किसी अन्य के सभी अपने प्रयोगों विफल रहे हैं।

अब मुझे लगता है कि getline() समारोह (नहीं std::istream पर एक ही नाम के साथ विधि) और से शामिल cstdlibstrtol() समारोह इस समस्या के लिए केवल उम्मीद के मुताबिक लगातार समाधान है कि। अगर कोई मुझे गलत साबित करता है तो मैं सराहना करता हूं।

#include <iostream> 
#include <cstdlib> 

// @arg prompt The question to ask. Will be used again on failure. 
int GetInt(const char* prompt = "? ") 
{ 
    using namespace std; // *1 
    while(true) 
    { 
     cout << prompt; 
     string s; 
     getline(cin,s); 
     char *endp = 0; 
     int ret = strtol(s.c_str(),&endp,10); 
     if(endp!=s.c_str() && !*endp) 
      return ret; 
    } 
} 
  • * 1: यहाँ एक मैं उपयोग की तरह कुछ है वैश्विक विस्तार के लिए using namespace whatever; रखने टूट करने के लिए "एकता बनाता है" नेतृत्व कर सकते हैं (! गूगल) बड़ी परियोजनाओं पर, इसलिए बचा जाना चाहिए। छोटी परियोजनाओं पर भी, इस तरह का उपयोग न करने का अभ्यास करें!
  • फ़ाइलों से पूर्णांक पढ़ना एक बहुत ही अलग मामला है। राउल रोआ का दृष्टिकोण ठीक से काम करने के लिए अच्छा हो सकता है। मैं यह भी सुझाव देता हूं कि गलत इनपुट फ़ाइलों को बर्दाश्त नहीं किया जाना चाहिए, लेकिन यह वास्तव में एप्लिकेशन पर निर्भर करता है।
  • चेतावनी दीजिये कि >> और getline() का उपयोग उसी प्रोग्राम में cin पर कुछ समस्याएं पैदा करेगा। इनमें से केवल एक का उपयोग करें, या Google को इस मुद्दे को संभालने के तरीके के बारे में जानने के लिए (बहुत कठिन नहीं) का उपयोग करें।
1

शीर्ष जवाब here और this वेबसाइट से तकनीक का मेल, मैं

इनपुट मिलता है।एक
अमान्य इनपुट: ज

#include <ios> // Provides ios_base::failure 
#include <iostream> // Provides cin 

template <typename T> 
T getValidatedInput() 
{ 
    // Get input of type T 
    T result; 
    cin >> result; 

    // Check if the failbit has been set, meaning the beginning of the input 
    // was not type T. Also make sure the result is the only thing in the input 
    // stream, otherwise things like 2b would be a valid int. 
    if (cin.fail() || cin.get() != '\n') 
    { 
     // Set the error state flag back to goodbit. If you need to get the input 
     // again (e.g. this is in a while loop), this is essential. Otherwise, the 
     // failbit will stay set. 
     cin.clear(); 

     // Clear the input stream using and empty while loop. 
     while (cin.get() != '\n') 
      ; 

     // Throw an exception. Allows the caller to handle it any way you see fit 
     // (exit, ask for input again, etc.) 
     throw ios_base::failure("Invalid input."); 
    } 

    return result; 
} 

प्रयोग

inputtest.cpp

#include <cstdlib> // Provides EXIT_SUCCESS 
#include <iostream> // Provides cout, cerr, endl 

#include "input.h" // Provides getValidatedInput<T>() 

int main() 
{ 
    using namespace std; 

    int input; 

    while (true) 
    { 
     cout << "Enter an integer: "; 

     try 
     { 
      input = getValidatedInput<int>(); 
     } 
     catch (exception e) 
     { 
      cerr << e.what() << endl; 
      continue; 
     } 

     break; 
    } 

    cout << "You entered: " << input << endl; 

    return EXIT_SUCCESS; 
} 

नमूना रन

एक पूर्णांक दर्ज करें।
एक पूर्णांक दर्ज करें: 2b
अमान्य इनपुट।
एक पूर्णांक दर्ज करें:
आपने दर्ज किया: 3.

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