2012-04-25 15 views
9

Sono nuovo nel linguaggio C# e ho iniziato ad apprenderlo solo per XNA Game Studio per X-box.Console.La lettura viene ignorata

Ho alcune esperienze minori con Java e C++, quindi non sono un noob TOTALE. Questo è esattamente il motivo per cui questo problema è così frustrante per me.

Ho creato un codice semplice progettato per aggiungere due numeri di input dall'utente. Roba estremamente semplice, ma un buon primo passo per ogni nuovo linguaggio che sento.

Ho dichiarato le mie variabili e stavo cercando di utilizzare Console.Read() per ottenere numeri da aggiungere all'utente. Finora, il codice emette il messaggio che voglio, quindi si ferma e legge in un singolo input dall'utente. Dopo ciò, incasina. La console emette il messaggio successivo, legge un numero casuale (nessun input), quindi li somma e li emette istantaneamente.

Ecco il mio codice:

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); 

     } 
    } 
} 

piste del campione:

Si prega di inserire il primo numero da aggiungere:

Si prega di inserire il secondo numero da aggiungere:

Il totale dei due numeri è: 63


Si prega di inserire il primo numero da aggiungere:

Si prega di inserire il secondo numero da aggiungere:

La somma dei due numeri è: 64


Continua così, comportandosi come se il secondo numero fosse 61.

Grazie in anticipo per qualsiasi aiuto!

risposta

11

Questo perché sta leggendo il prossimo carattere dalla console e quindi convertendolo in int, che fornisce il valore ASCII, non il valore numerico. Così digitando 2 viene interpretato come il carattere '2', con il codice ASCII 50. Prova a modificare:

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

+1 per una soluzione al problema invece di solo spiegazione – Marc

+0

Grazie per questo. Non sapevo che restituisse il codice ASCII Per gli altri che dicono usare Console.ReadLine(), l'ho provato, bu t ha restituito un errore: non è possibile convertire in modo complicato il tipo 'stringa' in 'int' Immagino che mi fossi fiducioso nel pensare che questo avrebbe funzionato. XD Grazie ancora per la spiegazione molto dettagliata! –

+0

@Mitchell Thomas McCann. Ma questo metodo con 'Int32.Parse' non funziona per te? – Tudor

6

Console.Read legge un singolo carattere . Quindi quando inserisci "2" e premi Invio, stai fornendo (1) il carattere "2", il cui valore ASCII è 50, e quindi (2) il carattere di ritorno a capo, il cui valore ASCII è 13. La somma di questi sono ... 63. :-)

+0

Non lo sapevo riguardo l'ASCII. Pensavo che restituisse ciò che era stato inserito prima che venisse letto uno spazio bianco. Grazie! –

+0

@MitchellThomasMcCann Dal momento che è già scattato, suggerirei una rapida panoramica sull'articolo di Wikipedia su ASCII e una [tabella di riferimento] (http://en.wikipedia.org/wiki/ASCII#ASCII_printable_characters) su quell'articolo di quali caratteri mappano a quali codici ASCII. (Le colonne DEC e Glifo sono rilevanti qui) – Izkata

0

Probabilmente vuoi che ReadLine non sia letto come letto prende il carattere successivo nello stream, ma ReadLine aspetterà che l'utente prema invio.

Ciò causerebbe un errore se il tipo di utente 34 la prima volta, perché firstNumber uguale 3 non 34.

1

Il problema è che Console.Read() legge la prima pressione del tasto di ritorno e invia che al secondo Console.Read() chiamata. Il codice dovrebbe utilizzare ReadLine() invece e simile a questa:

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

In aggiunta a quanto detto Gareth, forse le informazioni MSDN sarà chiaro a voi perché non è in attesa di un input al secondo Console.Read() metodo:

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.

Quindi, sul tuo primo Read() è felicemente che consente di immettere quello che vuoi, fino a h Inserire

Quindi, arriva al secondo Console.Read() e dice "Ehi, ho già quei caratteri della prima Console.Read() da esaminare. Accade solo che il secondo sia uno spazio bianco (il ritorno a capo) "e assegna quel valore ASCII a SecondNumber.

+0

Grazie. Ho letto che, tuttavia, pensavo significasse: Leggi tutta la stringa di numeri in prima chiamata. Leggi numero singolo su seconda chiamata. Ripetere. Ad esempio, più fermate per ottenere i dati. Grazie per il chiarimento! –

1

Console.Read legge un singolo carattere dal blocco di input. Se si immette un numero e si preme il tasto il tasto eNTER si leggerà il tasto Invio, o la prossima cifra del primo numero immesso.

è probabile che desidera utilizzare Console.ReadLine invece.

Problemi correlati