Problemi Console.Read () e Console.ReadLine ()

Ho cercato di utilizzare Console.Read () e Console.ReadLine () in C # ma ho ottenuto risultati strani. per esempio questo codice

Console.WriteLine("How many students would you like to enter?"); int amount = Console.Read(); Console.WriteLine("{0} {1}", "amount equals", amount); for (int i=0; i < amount; i++) { Console.WriteLine("Input the name of a student"); String StudentName = Console.ReadLine(); Console.WriteLine("the Students name is " + StudentName); } 

mi ha dato quell’ammontare = 49 quando inserisco 1 per il numero di studenti, e Im non ho nemmeno la possibilità di inserire il nome di uno studente.

Questo perché leggi un carattere. Utilizzare metodi appropriati come ReadInt32() che si occupa di una conversione corretta dal simbolo di lettura al tipo desiderato.

Il motivo per cui ottieni 49 è perché è un codice char del simbolo “1” e non è una rappresentazione intera.

 char code 0 : 48 1 : 49 2: 50 ... 9: 57 

per esempio: ReadInt32() può assomigliare a questo:

 public static int ReadInt32(string value){ int val = -1; if(!int.TryParse(value, out val)) return -1; return val; } 

e usa questo come:

 int val = ReadInt32(Console.ReadLine()); 

Sarebbe davvero bello avere la possibilità di creare un extension method , ma sfortunatamente non è ansible creare un metodo di estensione su tipo statico e Console è un tipo static .

ottieni un carattere char da read not an int. dovrai prima creare una stringa e analizzarla come stringa. L’implementazione potrebbe essere simile al seguente

  Console.WriteLine("How many students would you like to enter?"); var read = Console.ReadLine(); int amount; if(int.TryParse(read,out amount)) { Console.WriteLine("{0} {1}", "amount equals", amount); for (int i=0; i < amount; i++) { Console.WriteLine("Input the name of a student"); String StudentName = Console.ReadLine(); Console.WriteLine("the Students name is " + StudentName); } } 

L'ho modificato per usare readline perché readline restituisce una stringa e non limita arbitrariamente il numero di studenti a 9 (il numero massimo con una cifra)

Prova a cambiare il tuo codice in questo modo

 int amount; while(true) { Console.WriteLine("How many students would you like to enter?"); string number = Console.ReadLine(); if(Int32.TryParse(number, out amount)) break; } Console.WriteLine("{0} {1}", "amount equals", amount); for (int i=0; i < amount; i++) { Console.WriteLine("Input the name of a student"); String StudentName = Console.ReadLine(); Console.WriteLine("the Students name is " + StudentName); } 

Invece di usare Read usa ReadLine e poi controlla se l'input dell'utente è in realtà un numero intero usando Int32.TryParse . Se l'utente non inserisce un numero valido, ripeti la domanda.
L'uso di Console.Read limiterà il tuo input a un singolo carattere che deve essere convertito e controllato per essere un numero valido.

Naturalmente questo è un esempio brutale senza alcun controllo degli errori o qualsiasi tipo di abortire in sicurezza dai loop.

Per qualcuno che potrebbe ancora aver bisogno di questo:

 static void Main(string[] args) { Console.WriteLine("How many students would you like to enter?"); var amount = Convert.ToInt32(Console.ReadLine()); Console.WriteLine("{0} {1}", "amount equals", amount); for (int i = 0; i < amt; i++) { Console.WriteLine("Input the name of a student"); String StudentName = Console.ReadLine(); Console.WriteLine("the Students name is " + StudentName); } } 

Console.Read() sta restituendo il codice char del carattere che hai inserito. È necessario utilizzare Convert.ToChar(amount); per ottenere il carattere come una stringa, e quindi dovrai fare int.Parse() per ottenere il valore che stai cercando.

Console.Read restituisce il valore ASC del carattere chiave che è stato premuto.

Se usi Console.ReadKey().KeyChar otterrai un char che rappresenta il carattere reale che è stato premuto.

È quindi ansible trasformare quel carattere in una stringa di un carattere usando .ToString() .

Ora che hai una stringa puoi usare int.Parse o int.TryParse per trasformare una stringa contenente caratteri interamente numerici in un numero intero.

Quindi mettendo tutto insieme:

 int value; if (int.TryParse(Console.ReadKey().KeyChar.ToString(), out value)) { //use `value` here } else { //they entered a non-numeric key } 

Invece di:

 int amount = Console.Read(); 

provare:

 int amount = 0; int.TryParse(Console.ReadLine(), out amount); 

È perché si legge solo il codice del carattere, quindi ad esempio digitando 11 si otterrà comunque 49. È necessario leggere il valore stringa e analizzarlo sul valore int. Con il codice sopra in caso di input errato Otterrai 0.

Prova questo:

 int amount = ReadInt32(); 

o se non funziona prova questo:

 int amount = Console.ReadInt32(); 

o questo:

 int amount = Convert.ToInt32(Console.Readline()); 

In questo, leggerà la stringa, quindi la convertirà in valore Int32.

Puoi anche andare qui: http://www.java2s.com/Tutorials/CSharp/System.IO/BinaryReader/C_BinaryReader_ReadInt32.htm

Se non funziona, per favore fatemelo sapere.

 Console.WriteLine("How many students would you like to enter?"); string amount = Console.ReadLine(); int amt = Convert.ToInt32(amount); Console.WriteLine("{0} {1}", "amount equals", amount); for (int i = 0; i < amt; i++) { Console.WriteLine("Input the name of a student"); String StudentName = Console.ReadLine(); Console.WriteLine("the Students name is " + StudentName); } //thats it 

TL; DR; Il tasto Invio in Windows non è un singolo carattere. Questo fatto è alla radice di molti problemi relativi al metodo Console.Read() .

Dettagli completi : se corri sotto un pezzo di codice sul tuo computer, puoi risolvere molti misteri dietro Console.Read() :

 static void Main(string[] args) { var c = Console.Read(); Console.WriteLine(c); c = Console.Read(); Console.WriteLine(c); } 

Durante l’esecuzione del programma, premi il tasto Invio una sola volta sulla tastiera e controlla l’output sulla console. Di seguito è come appare:

inserisci la descrizione dell'immagine qui

È interessante notare che hai premuto il tasto Invio una sola volta, ma è stato in grado di soddisfare due chiamate di Read() nel mio frammento di codice. Il tasto Invio in Windows emette due caratteri per un nuovo carattere di riga, cioè ritorno a capo ( \r – codice ASCII 13) e avanzamento riga ( \n – codice ASCII 10). Puoi leggere di più qui in questo post: Il ritorno a capo di Windows \ r \ n è composto da due caratteri o un carattere?