Lesen einer Ganzzahl aus Benutzereingaben


74

Was ich suche, ist, wie man eine vom Benutzer angegebene Ganzzahl über die Befehlszeile (Konsolenprojekt) liest. Ich kenne hauptsächlich C ++ und habe den C # -Pfad eingeschlagen. Ich weiß, dass Console.ReadLine (); Nimmt nur ein Zeichen / einen String. Kurz gesagt, ich suche nach der ganzzahligen Version davon.

Nur um Ihnen eine Vorstellung davon zu geben, was ich genau mache:

Console.WriteLine("1. Add account.");
Console.WriteLine("Enter choice: ");
Console.ReadLine(); // Needs to take in int rather than string or char.

Ich habe eine ganze Weile danach gesucht. Ich habe viel auf C gefunden, aber nicht auf C #. Ich habe jedoch einen Thread auf einer anderen Site gefunden, der vorschlug, von char nach int zu konvertieren. Ich bin sicher, es muss einen direkteren Weg geben als das Konvertieren.


1
Ich denke, Sie werden keine Ganzzahlversion von ReadLinehaben. Sie sollten den Rückgabewert beibehalten stringund versuchen, ihn in int(möglicherweise Int32.TryParseoder andere ans mit try / catch) zu konvertieren. Wenn der Eintrag nicht erfolgt int, fordern Sie den Benutzer zu einem weiteren Versuch auf.
Gefangener

1
Besser ist es, Eingaben in Zeichenfolgenvariablen vorzunehmen und diese dann int.TryParsefür die Konvertierung zu verwenden.
Hassan

Antworten:


122

Sie können die Zeichenfolge mit der Funktion Convert.ToInt32 () in eine Ganzzahl konvertieren

int intTemp = Convert.ToInt32(Console.ReadLine());

3
Erstaunlich, ich habe es schon einmal versucht und es hat nicht funktioniert. Aber habe es einfach noch einmal versucht und es hat ... Danke Console.WriteLine ("1. Konto hinzufügen."); Console.WriteLine ("Auswahl eingeben:"); int choice = Convert.ToInt32 (Console.ReadLine ()); if (choice == 1) // und so weiter. Das hat funktioniert. Wird als Antwort markieren.
TomG

Diese Antwort ist völlig falsch. Convert.ToInt32 oder Int32.Parse schlagen mit einer Ausnahme fehl, wenn die Benutzereingabe keine Zahl ist. Verwenden Sie immer Int32.TryParse, wenn Sie nicht garantieren können, dass Ihre Eingabe eine Zahl ist.
Steve

60

Ich würde vorschlagen, dass Sie verwenden TryParse:

Console.WriteLine("1. Add account.");
Console.WriteLine("Enter choice: ");
string input = Console.ReadLine();
int number;
Int32.TryParse(input, out number);

Auf diese Weise löst Ihre Anwendung keine Ausnahme aus, wenn Sie versuchen, etwas wie "1q" oder "23e" zu analysieren, weil jemand eine fehlerhafte Eingabe vorgenommen hat.

Int32.TryParseGibt einen booleschen Wert zurück, sodass Sie ihn in einer ifAnweisung verwenden können, um festzustellen, ob Sie Ihren Code verzweigen müssen oder nicht:

int number;
if(!Int32.TryParse(input, out number))
{
   //no, not able to parse, repeat, throw exception, use fallback value?
}

Zu Ihrer Frage: Sie werden keine Lösung zum Lesen einer Ganzzahl finden, da ReadLine()die gesamte Befehlszeile gelesen wird und drei Zeichenfolgen zurückgegeben werden. Sie können versuchen, diese Eingabe in eine Variable int16 / 32/64 zu konvertieren.

Hierfür gibt es verschiedene Methoden:

Wenn Sie Zweifel an der zu konvertierenden Eingabe haben, wählen Sie immer die TryParse-Methoden, unabhängig davon, ob Sie versuchen, Zeichenfolgen, int-Variablen oder was nicht zu analysieren.

Update In C # 7.0 out-Variablen können direkt dort deklariert werden, wo sie als Argument übergeben werden, sodass der obige Code wie folgt zusammengefasst werden kann:

if(Int32.TryParse(input, out int number))
{
   /* Yes input could be parsed and we can now use number in this code block 
      scope */
}
else 
{
   /* No, input could not be parsed to an integer */
}

Ein vollständiges Beispiel würde folgendermaßen aussehen:

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("Hello World!");
        var foo = Console.ReadLine();
        if (int.TryParse(foo, out int number1)) {
            Console.WriteLine($"{number1} is a number");
        }
        else
        {
            Console.WriteLine($"{foo} is not a number");
        }
        Console.WriteLine($"The value of the variable {nameof(number1)} is {number1}");
        Console.ReadLine();
    }
}

Hier können Sie sehen, dass die Variable number1auch dann initialisiert wird, wenn die Eingabe keine Zahl ist und unabhängig davon den Wert 0 hat, sodass sie auch außerhalb des deklarierenden if-Blocks gültig ist


2
Upvote. int.TrypParseist eine bessere Lösung. @Serv ist gut, wenn Sie if-Bedingung oder Bool-Variable für das Analyseergebnis hinzufügen. Das sollte die Verwendung von int.TryParse rechtfertigen.
Hassan

1
Gute Antwort, aber das Ganze könnte auf eine einzelne Zeile vereinfacht werden: if (! Int32.TryParse (Console.ReadLine (), out int input)) {// ungültige Eingabe verarbeiten}
Andrew

9

Sie müssen die Eingabe typisieren. Versuchen Sie Folgendes

int input = Convert.ToInt32(Console.ReadLine()); 

Es wird eine Ausnahme ausgelöst, wenn der Wert nicht numerisch ist.

Bearbeiten

Ich verstehe, dass das oben Genannte schnell ist. Ich möchte meine Antwort verbessern:

String input = Console.ReadLine();
int selectedOption;
if(int.TryParse(input, out selectedOption))
{
      switch(selectedOption) 
      {
           case 1:
                 //your code here.
                 break;
           case 2:
                //another one.
                break;
           //. and so on, default..
      }

} 
else
{
     //print error indicating non-numeric input is unsupported or something more meaningful.
}

5
int op = 0;
string in = string.Empty;
do
{
    Console.WriteLine("enter choice");
    in = Console.ReadLine();
} while (!int.TryParse(in, out op));

1
Diese Antwort sollte weiter oben in der Liste stehen. Es ist die einzige, die falsche Eingaben verarbeitet und den Benutzer ohne Ausnahme erneut versuchen lässt. Ich würde nur die string.EmptyZuordnung entfernen .
Andrew

3

Ich habe verwendet int intTemp = Convert.ToInt32(Console.ReadLine());und es hat gut funktioniert, hier ist mein Beispiel:

        int balance = 10000;
        int retrieve = 0;
        Console.Write("Hello, write the amount you want to retrieve: ");
        retrieve = Convert.ToInt32(Console.ReadLine());

3

Ich habe keine gute und vollständige Antwort auf Ihre Frage gesehen, daher werde ich ein vollständigeres Beispiel zeigen. Es gibt einige Methoden, die zeigen, wie man vom Benutzer eine Ganzzahl-Eingabe erhält, aber wann immer Sie dies tun, müssen Sie dies normalerweise auch tun

  1. Überprüfen Sie die Eingabe
  2. eine Fehlermeldung anzeigen, wenn eine ungültige Eingabe erfolgt, und
  3. Schleife durch, bis eine gültige Eingabe gegeben wird.

Dieses Beispiel zeigt, wie Sie vom Benutzer einen ganzzahligen Wert erhalten, der gleich oder größer als 1 ist. Wenn eine ungültige Eingabe angegeben wird, wird der Fehler abgefangen, eine Fehlermeldung angezeigt und der Benutzer aufgefordert, erneut zu versuchen, eine korrekte Eingabe vorzunehmen.

static void Main(string[] args)
    {
        int intUserInput = 0;
        bool validUserInput = false;

        while (validUserInput == false)
        {
            try
            { Console.Write("Please enter an integer value greater than or equal to 1: ");
              intUserInput = int.Parse(Console.ReadLine()); //try to parse the user input to an int variable
            }  
            catch (Exception) { } //catch exception for invalid input.

            if (intUserInput >= 1) //check to see that the user entered int >= 1
              { validUserInput = true; }
            else { Console.WriteLine("Invalid input. "); }

        }//end while

        Console.WriteLine("You entered " + intUserInput);
        Console.WriteLine("Press any key to exit ");
        Console.ReadKey();
    }//end main

In Ihrer Frage sieht es so aus, als wollten Sie dies für Menüoptionen verwenden. Wenn Sie also eine Eingabe für die Auswahl einer Menüoption erhalten möchten, können Sie die if-Anweisung in ändern

if ( (intUserInput >= 1) && (intUserInput <= 4) )

Dies würde funktionieren, wenn der Benutzer eine Option von 1, 2, 3 oder 4 auswählen müsste.


Das Auslösen einer Ausnahme um Benutzereingaben, ohne zumindest einen Wert mit zu testen, TryParseist eine teure Methode zur Durchführung der Benutzereingabevalidierung
Mark Schultheiss

2

Besser ist es, TryParse zu verwenden:

Int32 _userInput;
if(Int32.TryParse (Console.Readline(), out _userInput) {// do the stuff on userInput}


0
static void Main(string[] args)
    {
        Console.WriteLine("Please enter a number from 1 to 10");
        int counter = Convert.ToInt32(Console.ReadLine());
        //Here is your variable
        Console.WriteLine("The numbers start from");
        do
        {
            counter++;
            Console.Write(counter + ", ");

        } while (counter < 100);

        Console.ReadKey();

    }

0

Versuchen Sie dies, es wird keine Ausnahme ausgelöst und der Benutzer kann es erneut versuchen:

        Console.WriteLine("1. Add account.");
        Console.WriteLine("Enter choice: ");
        int choice = 0;
        while (!Int32.TryParse(Console.ReadLine(), out choice))
        {
            Console.WriteLine("Wrong input! Enter choice number again:");
        }

-1

Sie könnten einfach weitermachen und versuchen:

    Console.WriteLine("1. Add account.");
    Console.WriteLine("Enter choice: ");
    int choice=int.Parse(Console.ReadLine());

Das sollte für die case-Anweisung funktionieren.

Es funktioniert mit der switch-Anweisung und löst keine Ausnahme aus.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.