webForumDet fria alternativet

Fel i tangentbordsläsning?

7 svar · 239 visningar · startad av pettsson

pettssonMedlem sedan jan. 20021 122 inlägg
#1

Vad är det för fel på denna avläsning av tangentbordet? Det verkar inte som om det som skrivs in sparas till MenyVal...

try
		{
			MenyVal = System.in.read();
		}
		catch(IOException i)
		{
			System.out.println(i);
		}

Den efterföljande switchsatsen blir som om MenyVal, som är en integer, vore tom, alltså den kör case default.

Aleph_OneMedlem sedan juni 2003372 inlägg
#2

Det ser rätt ut..

testa denna koden så ser du att den skriver ut första tecknet som char och int.

public class ReadKeyboardStrokes
{
	public static void main(String[] args)
	{
		int i;
		try
		{
			System.out.print("Input: ");
			i = (char)System.in.read();
			System.out.println("First char you entered is : " + (char)i + " ("+ i +")");
		}
		catch(Exception e)
		{
			e.printStackTrace();
		}
	}
}
pettssonMedlem sedan jan. 20021 122 inlägg
#3

Jaha, nu visar det sig att MenyVal tydligen sparar koden för tecknet, inte teckenet i sig, som var meningen... Hur ska jag gå till väga för att MenyVal ska spara en etta och inte 49 om jag skriver en etta?

Aleph_OneMedlem sedan juni 2003372 inlägg
#4

I princip göra om det till en sträng och sen kovertera den till en int.

Tänk på att du lätt kan få NumberFormatException nu..

int num;
try
{
	System.out.print("Input: ");
	num = Integer.parseInt(""+(char)System.in.read());
	System.out.println("number: " + num);
}
catch(Exception e)
{
	e.printStackTrace();
}
PeWMedlem sedan juni 200010 432 inlägg
#5

Hum.... en int och en char är s.k primitiva datatyper även i Java. Det medför att om det är ett numeriskt värde man söker av exempelvis en char så behöver man bara skala av ascii. Så talet 0 exempelvis läses in som 0 om det är int som läses in och som 0x30 om det är en char som läser in 0. Detta ger att en konvertering från en char till en int lättast görs med "variabel - 0x30". Att parsa med Integer.parseInt() är mao onödigt och i exemplet ovan blir det ju lite overhead om man först konstruerar en tom sträng och sen lägger till en char. Vill man vara säker på att det är 0-9 man får in är det ju enkelt att lägga read() i en iteration med validering som villkor.

Aleph_OneMedlem sedan juni 2003372 inlägg
#6

Visst blir det overhead men det är inte precis ett tidskritist block.. att läsa in ett tecken från tangentbordet :)

PeWMedlem sedan juni 200010 432 inlägg
#7

Aleph_One skrev:

Visst blir det overhead men det är inte precis ett tidskritist block.. att läsa in ett tecken från tangentbordet :)

Nej det är OK. :)

Men det är ju enklare att bara skala bort 0x30 ;)

LimeMedlem sedan sep. 2001961 inlägg
#8

Men om det är meningen att använda tangentbordstryckningen i en switch-sats så finns det ju inget behov av att konvertera den till en int.

Funkar lika bra om man gör:

char val;
try
{
	System.out.print("Input: ");
	val = (char)System.in.read();

}
catch(Exception e)
{
	e.printStackTrace();
}

switch(val) {
                case '1':
                case '2':
                case 'p':
}

och så får man ju något fler än 10 valmöjligheter...

127 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
124 ms — hämta tråd, inlägg och bilagor (db)