2012-06-27 4 views
6

Ich bin immer noch ein Anfänger in der Programmierung in höheren Programmiersprachen, also weiß ich nicht, ob das eine einfache Lösung ist, aber ich bin trotzdem froh, es zu lernen. Ich habe in C# ein kleines Alarmprogramm programmiert, mit dem der Benutzer eingibt, in wie vielen Sekunden der Alarm ausgelöst werden soll. Es funktioniert perfekt, aber die Eingabe, die der Benutzer geben muss, muss eine Nummer sein. Wenn der Benutzer irgendeine Form von Text eingibt, stürzt das Programm ab. Nun, wie kann ich verhindern, dass Benutzer Text eingeben und eine Funktion aufrufen oder etwas anderes tun, wenn der Benutzer dies tut, anstatt dass das Programm gerade abstürzt?Wie verhindert man bestimmte Formen der Eingabe beim Schreiben von Methoden?

Dies ist der Code, den ich jetzt habe:

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

Nun, aus der Spitze von meinem Kopf, könnten Sie ein '' try' catch' um die Konvertiten verwenden und behandeln die Ausnahme aber wie Sie, zum Beispiel fragen sie einen Wert erneut einzugeben. – user17753

+3

Bei einer separaten Notiz ist "int" ein "Int32" und kein "Int16". 'short' ist der Alias ​​für' Int16' –

+0

@JustinPihony, von dem ich noch nicht einmal wusste. Ich habe alle Antworten aus der Vergangenheit akzeptiert, die mir geholfen haben. Danke für den Tipp. :) – DutchLearner

Antwort

11

Sie sollten einen Scheck abgeschlossen sein, bevor die Umwandlung:

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 eine boolean zurückgeben markieren, ob die Eingabe in einen int parsable ist. Es wird auch Ihre sec Variable auf den Wert setzen, wenn erfolgreich.

+0

Das hat funktioniert, danke einen Haufen! Ich musste es nur in eine while-Schleife einfügen und einen booleschen Wert erstellen, der auswertet, ob die Funktion beendet werden kann oder nicht, und das war es. : D – DutchLearner

1

Sie versuchen Parse-Methode verwenden soll.

Etwas wie folgt aus:

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

Wenn das Ergebnis wahr ist, dann hat es erfolgreich analysiert es, was bedeutet es eine ganze Zahl ist. Wenn nicht, ist es fehlgeschlagen, was bedeutet, dass es keine Ganzzahl ist.

Sie können dann Zahl als Wert verwenden, der als int32 analysiert wurde.

0

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

mit

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

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

NO !, TryParse ist aus einem bestimmten Grund da, keine Ausnahmen für die normale Steuerung des Durchflusses. –

+0

@ Scott: ist richtig. Wurf Ausnahme ist teurer. Vermeiden Sie es, wenn Sie können – codingbiz

+0

Ich bin mir nicht sicher über die Kosten, aber es beseitigt die zusätzliche if-Anweisung – madhairsilence

7

Sie könnten ersetzen Schleife auf unbestimmte Zeit, bis der Benutzer gibt eine Zahl:

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

Int32.TryParse kehrt false, wenn die Konvertierung fehlgeschlagen ist, statt eine zu werfen Ausnahme und wenn erfolgreich, gibt das Ergebnis zurück i n der zweite out Parameter.

0

Was Sie versuchen, wird oft Input Validation genannt. In Ihrem Fall müssen Sie überprüfen, ob sie eine Nummer eingegeben haben, bevor Sie sie analysieren. Int16 hat eine TryParse Funktion, die Ihnen helfen wird.

1

Bereits Leute haben hier geantwortet. Ich liebe es, das als extension method zu machen, so dass ich es an so vielen Orten anrufen kann.

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

Dann werde ich es nennen wie diese

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

eine separate Funktion Hinzufügen, die eine try-Anweisung verwendet den Fehler abzufangen, ist produzieren, wenn Sie versuchen, eine ungültige Zeichenfolge in eine ganze Zahl verdeckte.

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

Sie möchten dies nicht tun ... Die Ausnahmebehandlung, um einen Teil des Kontrollflusses zu bilden, ist vergleichbar mit der Verwendung von nicht-lokalen goto-Anweisungen in Ihrem gesamten Code. – Blueberry

0

Wenn Sie etwas eleganter als eine Fehlermeldung anzeigt tun wollen und bat um die Benutzerdaten erneut eingeben, könnten Sie versuchen, jeden Tastendruck verarbeiten, wie es mit Console.Readkey() und Ablehnung ihnen geschieht, wenn die in einem String führen würde das ist keine Nummer.

Ich habe so etwas vor Jahren in TurboPascal gemacht.

Dies ist Pseudocode geschrieben aus dem Speicher, aber sollte Sie auf dem richtigen Weg bekommen. Wenn Sie Fließkommawerte sowie ganze Zahlen oder negative und positive Zahlen verwenden müssen, müssen Sie mehr Logik hinzufügen, um diese Fälle zu behandeln.

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? 
    } 
} 
Verwandte Themen