2012-06-27 25 views
6

मैं अभी भी उच्च स्तरीय प्रोग्रामिंग भाषाओं में प्रोग्रामिंग करने वाला एक नौसिखिया हूं, इसलिए मुझे नहीं पता कि यह एक आसान समाधान है, लेकिन मुझे वैसे भी सीखने में खुशी है। मैंने सी # में थोड़ा अलार्म प्रोग्राम प्रोग्राम किया है जो कि उपयोगकर्ता इनपुट को अलार्म को कितने सेकंड बंद करने की आवश्यकता है। यह पूरी तरह से काम करता है, लेकिन उपयोगकर्ता को जो इनपुट देना है वह एक संख्या होना चाहिए। जब उपयोगकर्ता किसी भी प्रकार का टेक्स्ट इनपुट करता है, तो प्रोग्राम क्रैश हो जाता है। अब, मैं प्रोग्राम उपयोगकर्ताओं को इनपुट टेक्स्ट को कैसे रोक सकता हूं, और किसी फ़ंक्शन को कॉल कर सकता हूं या जब उपयोगकर्ता करता है तो कुछ और करता है, प्रोग्राम की बजाय क्रैश हो रहा है?तरीकों को लिखते समय इनपुट के कुछ रूपों को कैसे रोकें?

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace Test 
{ 
    class Alarm 
    { 
     public static void play() 
     { 
      int sec; 
      sec = Convert.ToInt16(Console.ReadLine()); 

      for (int i = 0; i < seconds; ++i) 
      { 
       System.Threading.Thread.Sleep(1000); 
      } 

      for (int i = 0; i < 10; i++) 
      { 
       Console.Beep(); 
      } 
     } 
    } 
} 
+0

ठीक है, मेरे सिर के ऊपर से, आप एक '' try' catch' परिवर्तित चारों ओर का उपयोग और जैसे आप चाहें अपवाद संभाल सकता, उदाहरण के लिए उन्हें एक मूल्य के पुन: दर्ज करने के लिए कहें। – user17753

+3

एक अलग नोट पर, 'int' एक' Int32' 'int16' नहीं है। 'छोटा' 'Int16' –

+0

@ जस्टिन पिहनी के लिए उपनाम है, मुझे इसके बारे में भी पता नहीं था। मैंने अतीत से सभी उत्तरों को स्वीकार किया जिसने मेरी मदद की। पारितोषिक के लिए धन्यवाद। :) – DutchLearner

उत्तर

11

आप परिवर्तित करने से पहले एक जांच पूरा करना चाहिए:

int sec; 

if (int.TryParse(Console.ReadLine(), out sec) 
{ 
    // this is valid continue 
} 
else 
{ 
    // show error highlighting that entry must be a number 
} 

int.TryParse एक बूलियन पर प्रकाश डाला है कि क्या इनपुट को पूर्णांक में हल parsable है वापस आ जाएगी। यह सफल होने पर आपके sec चर को भी मूल्य में सेट करेगा।

+0

यह काम किया, एक गुच्छा धन्यवाद! मुझे केवल इसे थोड़ी देर में लूप करने और एक बूलियन मान बनाने की आवश्यकता है जिसने मूल्यांकन किया कि फ़ंक्शन खत्म हो सकता है या नहीं, और वह था। : डी – DutchLearner

1

आप एक कोशिश पार्स विधि का उपयोग करना चाहिए:

इस कोड को मैं अब है।

कुछ इस तरह:

int number; 
    bool result = Int32.TryParse(Console.ReadLine(), out number); 

यदि परिणाम सही है, तो यह इसे सफलतापूर्वक पार्स है, जो इसे एक पूर्णांक है का मतलब है। यदि नहीं, तो यह असफल रहा है, जिसका अर्थ है कि यह पूर्णांक नहीं है।

तब आप उस संख्या के रूप में उपयोग कर सकते हैं जो आपके int32 के रूप में पार्स किया गया था।

0

की जगह

sec = Convert.ToInt16(Console.ReadLine()); 

try { 
    sec = Convert.ToInt16(Console.ReadLine()); 
} 

catch(Exception e){ 
    Console.Writeline(" Enter numbers only"); 
} 
+6

नहीं !, TryParse किसी कारण से है, प्रवाह के सामान्य नियंत्रण के लिए अपवादों का उपयोग न करें। –

+0

@ स्कॉट: सही है। फेंकना अपवाद अधिक महंगा है। इससे बचें जब आप – codingbiz

+0

लागत के बारे में निश्चित नहीं हैं, लेकिन यह – madhairsilence

7

साथ आप कर सकते थे पाश को अनिश्चित काल तक उपयोगकर्ता एक नंबर इनपुट:

int number = 0; 
while(!Int32.TryParse(Console.ReadLine(), out number)) 
{ 
    Console.WriteLine("Please input a number."); 
} 

Int32.TryParse रिटर्न false रूपांतरण विफल रहा है, बजाय एक फेंकने की अगर अपवाद और यदि सफल परिणाम परिणाम देता है I n दूसरा out पैरामीटर।

0

जो आप करने की कोशिश कर रहे हैं उसे अक्सर Input Validation कहा जाता है। आपके मामले में आपको यह जांचने की आवश्यकता है कि उन्होंने इसे पार्स करने से पहले एक संख्या दर्ज की है। Int16 में TryParse फ़ंक्शन है जो आपकी मदद करेगा।

1

पहले से ही लोगों ने उत्तर दिया। मुझे इसे extension method के रूप में बनाना पसंद है ताकि मैं इसे कई स्थानों पर कॉल कर सकूं।

public static bool IsNumeric(this string theValue) 
{ 
    long retNum; 
    return long.TryParse(theValue, System.Globalization.NumberStyles.Integer, 
      System.Globalization.NumberFormatInfo.InvariantInfo, out retNum); 
} 

तब मैं इसे इस

if(Console.ReadLine().IsNumeric()) 
{ 
    //The value is numeric. You can use it  
} 
0

की तरह फोन एक अलग समारोह त्रुटि यह है कि जब आपकी कोशिश एक पूर्णांक के लिए अवैध स्ट्रिंग गुप्त उत्पादन को पकड़ने के लिए एक कोशिश बयान का उपयोग करता है जोड़ना होगा।

int readInput() 
{ 
    int sec; 
    while(true) 
    { 
     try 
     { 
      sec = Convert.ToInt16(Console.ReadLine()); 
      return sec; 
     } 
     catch(Exception e) 
        { 
          Console.WriteLine("Enter an integer!"); 
        } 
    } 
    return 0; 
} 
+0

आप यह नहीं करना चाहते हैं ... नियंत्रण प्रवाह का हिस्सा बनाने के लिए अपवाद हैंडलिंग आपके कोड पर गैर-स्थानीय गोटो स्टेटमेंट का उपयोग करने के समान है। – Blueberry

0

आपको एक त्रुटि संदेश प्रदर्शित करने और उपयोगकर्ता डेटा फिर से दर्ज करने के लिए पूछ की तुलना में अधिक सुंदर कुछ करना चाहते हैं, आप अगर एक स्ट्रिंग में परिणाम होगा प्रत्येक कीस्ट्रोक प्रसंस्करण Console.Readkey() साथ के रूप में यह होता है और उन्हें खारिज करने की कोशिश कर सकते यह एक संख्या नहीं है।

मैंने इस साल पहले टर्बोपास्कल में कुछ ऐसा किया था।

यह स्मृति से लिखित स्यूडोकोड है लेकिन आपको सही रास्ते पर ले जाना चाहिए। यदि आपको फ़्लोटिंग पॉइंट मानों के साथ-साथ पूर्णांक, या दोनों नकारात्मक और सकारात्मक संख्याएं लेने की आवश्यकता है तो आपको उन मामलों को संभालने के लिए और तर्क जोड़ने की आवश्यकता होगी।

string enteredText = ""; 
char key; 
bool done = false; 
while (!done) 
{ 
    key = Console.ReadKey(); 
    if (key is number) 
     enteredText += key; 
    else if (key is backspace) 
    { 
     //remove the last char from enteredText. Handle case where enteredText has length 0 
     Console.Write(backspace); 
    } 
    else if ((key is enter) && (enteredText.Length > 0)) 
     done = true; 
    else 
    { 
     // invalid char. 
     //MSDN says the char is echoed to the console so remove it 
     Console.Write(backspace); 
     //Beep at the user? 
    } 
} 

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

  • कोई संबंधित समस्या नहीं^_^