2012-04-25 12 views
9

Ich bin neu in der C# -Sprache und habe erst mit der Verwendung für das XNA Game Studio für X-Box begonnen.Console.Read wird ignoriert

Ich habe ein wenig Erfahrung mit Java und C++, also bin ich kein TOTAL noob. Genau deshalb ist dieses Problem für mich so frustrierend.

Ich habe einen einfachen Code erstellt, der zwei vom Benutzer eingegebene Zahlen hinzufügt. Extrem einfaches Zeug, aber ein guter erster Schritt für jede neue Sprache, die ich fühle.

Ich habe meine Variablen deklariert und versuchte Console.Read() zu verwenden, um Zahlen vom Benutzer zu erhalten. Bis jetzt gibt der Code die gewünschte Nachricht aus, stoppt dann und liest eine einzelne Eingabe vom Benutzer ein. Danach vermasselt es sich. Die Konsole gibt die nächste Nachricht aus, liest eine Zufallszahl (keine Eingabe), fügt sie dann zusammen und gibt sie sofort aus.

Hier ist mein Code:

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

namespace Add 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Console.WriteLine("Please enter the first number to add: "); 
      int firstNumber = Console.Read(); 

      Console.WriteLine("Please enter the second number to add: "); 
      int secondNumber = Console.Read(); 

      int Sum = firstNumber + secondNumber; 
      Console.WriteLine("The total of the two numbers is: " + Sum); 

     } 
    } 
} 

Probe läuft:

Bitte geben Sie die erste Zahl hinzuzufügen:

Bitte geben Sie die zweite Nummer hinzuzufügen:

Die Summe der zwei Zahlen ist: 63


Bitte geben Sie die erste Zahl hinzuzufügen:

Bitte die zweite Nummer eingeben hinzuzufügen:

Die Summe der beiden Zahlen ist: 64


Es geht so weiter, als ob die zweite Nummer 61 ist.

Vielen Dank im Voraus für jede Hilfe!

Antwort

11

Das liegt daran, dass es das nächste Zeichen von der Konsole liest und es dann in int konvertiert, das den ASCII-Wert und nicht den numerischen Wert angibt. Also 2 Eingabe wird als Zeichen interpretiert werden, ‚2‘, mit dem ASCII-Code 50 Versuchen Sie stattdessen:

int firstNumber = Int32.Parse(Console.ReadLine()); 
+1

+1 für eine Lösung des Problems statt nur einer Erklärung – Marc

+0

Danke für das. Ich wusste nicht, dass es den ASCII-Code zurückgab. Zu den anderen sagenden Gebrauch Console.ReadLine(), ich habe das versucht, BU t es gab einen Fehler zurück: complyitly kann den Typ 'string' in 'int' umwandeln Ich denke, ich war hoffnungsvoll, weil ich dachte, das würde funktionieren. XD Nochmals vielen Dank für die sehr detaillierte Erklärung! –

+0

@ Mitchell Thomas McCann. Aber diese Methode mit 'Int32.Parse' funktioniert nicht für Sie? – Tudor

6

Console.Read liest einen einzelnen Charakter. Wenn Sie also "2" eingeben und Enter drücken, liefern Sie (1) das Zeichen "2", dessen ASCII-Wert 50 ist, und dann (2) das Wagenrücklaufzeichen, dessen ASCII-Wert 13 ist. Die Summe von das ist ... 63. :-)

+0

Wusste das über das ASCII nicht. Dachte, es hat gerade zurückgegeben, was eingegeben wurde, bevor ein Leerzeichen gelesen wurde. Vielen Dank! –

+0

@MitchellThomasMcCann Da es dich schon stolperte, würde ich einen kurzen Blick auf den Wikipedia-Artikel über ASCII und eine [Referenztabelle] (http://en.wikipedia.org/wiki/ASCII#ASCII_printable_characters) zu diesem Artikel vorschlagen welche Zeichen welchen ASCII-Codes zugeordnet sind. (Die Spalten DEC und Glyph sind hier relevant) – Izkata

0

Sie möchten wahrscheinlich ReadLine nicht Lesen als Lesen nimmt das nächste Zeichen im Stream, aber ReadLine wird auf den Benutzer warten, um die Eingabe zu drücken.

Dies würde einen Fehler, wenn Ihr Benutzer Typ 34 das erste Mal verursachen, weil firstnumber 3 gleich nicht 34.

1

Das Problem ist, dass Console.Read() die erste Return keypress liest und sendet diese an die zweite Console.Read() Anruf. Der Code sollte ReadLine() stattdessen verwenden und wie folgt aussehen:

Console.WriteLine("Please enter the first number to add: "); 
int firstNumber = Convert.ToInt32(Console.ReadLine()); 

Console.WriteLine("Please enter the second number to add: "); 
int secondNumber = Convert.ToInt32(Console.ReadLine()); 
3

Zusätzlich zu dem, was Gareth sagte, vielleicht die MSDN Informationen werden Ihnen klären warum es nicht für Ihre Eingabe auf dem zweiten Console.Read warten() -Methode:

Console.Read()

The Read method blocks its return while you type input characters; it terminates when you press the Enter key. Pressing Enter appends a platform-dependent line termination sequence to your input (for example, Windows appends a carriage return-linefeed sequence). Subsequent calls to the Read method retrieve your input one character at a time. After the final character is retrieved, Read blocks its return again and the cycle repeats.

Also, auf Ihrem ersten Read() es glücklich ist so dass Sie, was Sie eingeben möchten, bis Sie h Geben Sie

Dann kommt es an die zweite Console.Read() und sagt: "Hey, ich habe bereits diese Zeichen von der ersten Console.Read() zu durchlaufen. Es kommt einfach vor, dass der zweite Whitespace (der Wagenrücklauf) "ist und der Whitespace-ASCII-Wert secondNumber zuweist.

+0

Danke. Ich habe gelesen, dass ich das aber meinte: Lesen Sie die gesamte Zeichenfolge von Zahlen beim ersten Anruf. Lesen Sie einzelne Nummer beim zweiten Anruf. Wiederholen. d. H. Mehrere Stopps, um Daten zu erhalten. Danke für die Abklärung! –

1

Console.Read liest ein einzelnes Zeichen aus dem Eingabeblock. Wenn Sie eine Zahl eingeben und dann die Taste drücken enter-Taste wird die enter-Taste oder die nächste Ziffer der ersten eingegebene Nummer lesen.

Sie werden wahrscheinlich Console.ReadLine wollen stattdessen verwenden.