मान्य करने के लिए कैसे करें मैं std::cin
का उपयोग कर हस्ताक्षरित दशमलव पर इनपुट मान को सीमित करने के बारे में जानना चाहता हूं।संख्यात्मक इनपुट सी ++
उत्तर
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 से असाइनमेंट से परहेज करता है।
cin
के समर्थन चर एक संख्या है, और प्रदान की स्ट्रिंग एक नंबर नहीं है, तो वापसी मान तो आप एक पाश की जरूरत है, गलत है:
int someVal;
while(!(cin >> someVal)) {
cin.reset();
cout << "Invalid value, try again.";
}
कुछ की तरह:
double a;
cin >> a;
अपने हस्ताक्षरित "दशमलव" जुर्माना पढ़ना चाहिए।
आपको एक लूप और कुछ कोड की आवश्यकता होगी ताकि यह सुनिश्चित किया जा सके कि यह एक समझदार तरीके से अमान्य इनपुट को संभालता है।
गुड लक!
सीन का >> ऑपरेटर एक समय में एक चरित्र को पढ़कर काम करता है जब तक वह सफेद जगह पर नहीं जाता। यह पूरे स्ट्रिंग -1a2.0
को स्लर्प करेगा, जो स्पष्ट रूप से एक संख्या नहीं है इसलिए ऑपरेशन विफल हो जाता है। ऐसा लगता है कि वास्तव में आपके पास तीन फ़ील्ड हैं, -1, ए, और 2.0। यदि आप व्हाइटस्पेस द्वारा डेटा को अलग करते हैं, तो सीन बिना किसी समस्या के प्रत्येक को पढ़ने में सक्षम होगा। दूसरे क्षेत्र के लिए char
पढ़ने के लिए बस याद रखें।
मैं कठोर होने की कोशिश नहीं कर रहा हूं। मैं सिर्फ एक समाधान साझा करना चाहता था जो मैंने प्रदान किया है जो मुझे विश्वास है कि यह अधिक मजबूत है और बेहतर इनपुट सत्यापन के लिए अनुमति देता है।
देखें करने के लिए: My Solution to Input Validation
मैं >>
ऑपरेटर का उपयोग उपयोगकर्ता से पूर्णांक इनपुट को पढ़ने के लिए कई तकनीकों कोशिश की, लेकिन एक तरह से या किसी अन्य के सभी अपने प्रयोगों विफल रहे हैं।
अब मुझे लगता है कि getline()
समारोह (नहीं std::istream
पर एक ही नाम के साथ विधि) और से शामिल cstdlib
strtol()
समारोह इस समस्या के लिए केवल उम्मीद के मुताबिक लगातार समाधान है कि। अगर कोई मुझे गलत साबित करता है तो मैं सराहना करता हूं।
#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 को इस मुद्दे को संभालने के तरीके के बारे में जानने के लिए (बहुत कठिन नहीं) का उपयोग करें।
शीर्ष जवाब 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.
- 1. सी # - संख्यात्मक प्रत्यय
- 2. आर: संख्यात्मक बनाम संख्यात्मक
- 3. सी - संख्यात्मक तारों की तुलना
- 4. टेक्स्ट फ़ील्ड में उपयोगकर्ता द्वारा संख्या इनपुट के संख्यात्मक मूल्य
- 5. इनपुट फ़ील्ड को संख्यात्मक और पासवर्ड दोनों प्रकार कैसे बनाएं?
- 6. संख्यात्मक रूपांतरण
- 7. मैं संख्यात्मक इनपुट दाएं और पाठ इनपुट को कैसे संरेखित कर सकता हूं?
- 8. UITextField (यानी, संख्यात्मक इनपुट) में इनपुट को सत्यापित करने के लिए कैसे करें
- 9. संख्यात्मक आउटपुट
- 10. संख्यात्मक एकीकरण
- 11. सी # में संख्यात्मक वर्ग का विस्तार?
- 12. UIAlertView: UIAlertViewStyleSecureTextInput: संख्यात्मक कुंजीपटल
- 13. सी # कुंजीपटल इनपुट भेजना
- 14. सी # कंसोल उपयोगकर्ता इनपुट
- 15. स्ट्रिंग इनपुट और सी
- 16. सी - उपयोगकर्ता इनपुट पढ़ना
- 17. संख्यात्मक कुंजियों
- 18. शब्द संख्यात्मक
- 19. डेटाटेबल्स संख्यात्मक
- 20. संख्यात्मक स्ट्रिंग
- 21. कैसे संख्यात्मक कुंजियों
- 22. स्ट्रिंग इनपुट
- 23. .NET संख्यात्मक पुस्तकालय
- 24. मान्य संख्यात्मक पाठ क्षेत्र jQuery
- 25. सी कमांड लाइन पासवर्ड इनपुट
- 26. जेपीएएसवर्डफ़िल्ल्ड इनपुट
- 27. संख्यात्मक() संख्यात्मक मानों की जांच करने के लिए
- 28. संख्यात्मक आदेश से अलग संख्यात्मक व्यवहार क्यों करता है?
- 29. जेएसटीएल सी: प्रत्येक के लिए, कम संख्यात्मक लूप असंभव है?
- 30. पीएचपी संख्यात्मक कुंजी
# 1: 'त्यागें' क्या है? # 2: क्यों '10'? मैक के बारे में क्या? # 3: आप पुनः प्रयास करने के लिए लूप कैसे बनाते हैं? जब आप इसे लिखते हैं तो इनपुट 'ddd' 'आज़माएं। आपको कई बार आपकी त्रुटियां मिलेंगी। यदि नहीं, तो मैं वास्तव में आपके समाधान के बारे में उत्सुक हूँ। – Notinlist