# Buchstaben einlesen



## java-anfaenger (29. Mai 2009)

hab folgenden Code:


```
import java.io.*;

public class Woerterraten {

	/**
	 * @param args
	 */
	public static void main(String[] args) throws IOException{
		BufferedReader eingabe = new BufferedReader(new InputStreamReader(System.in));
		String wort="Lokomotive";
		StringBuffer ratewort = new StringBuffer();

		for(int i = 0; i < wort.length(); i++) {
		  ratewort.append('*');
		}

		while(!ratewort.toString().equals(wort)) {

		  System.out.println(ratewort);
		  
		  System.out.println("Raten Sie das Wort! Buchstabe: ");
			String buchst = eingabe.readLine();
			char buchstabe = Char.parseChar(buchst);
		  for(int i = 0; i < wort.length(); i++) {
		    if(wort.charAt(i) == buchstabe) {
		      ratewort.setCharAt(i, buchstabe);
		    }
		  }

		}

		System.out.println("Sie haben gewonnen!");

	}

}
```

FM:

Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
	Char cannot be resolved

	at Woerterraten.main(Woerterraten.java:23)


Wie mache ich das mit dem einlesen am besten?


----------



## SlaterB (29. Mai 2009)

menschlicher Compiler Forum?
wollen wir mal nicht zuviel verraten: 
Char ist keine bekannte Klasse, bitte verwende nur bekannte Klassen, 
im Zweifel in der API nachschlagen 

Java Platform SE 6


----------



## Lexi (29. Mai 2009)

Wenn du einen String mit nur einem einzelnen Buchstaben hast kannst du den mit charAt(0) als char zurückgeben lassen. Ich weiß nicht, ob das unbedingt die schönste Lösung ist, aber ich denke sie sollte funktionieren.


----------



## heart_disease (29. Mai 2009)

Wie wär's denn damit?

```
import java.io.*;

public class Woerterraten {
	public static void main( String[] args ) throws IOException {
		BufferedReader br = new BufferedReader( new InputStreamReader(System.in) );
		String wort = "Lokomotive";
		byte[] ratewort = new byte[wort.length()];
		
		for( int i=0; i < ratewort.length; i++) {
			ratewort[i] = '*';
		}
		while( !equal(wort, ratewort) ) {
			System.out.write( ratewort );
			System.out.println();
			System.out.print("Raten Sie das Wort! Buchstabe: ");
			
			byte buchstabe = (byte) br.readLine().charAt( 0 );
			
			for( int i=0; i < ratewort.length; i++ ) {
				if( wort.charAt(i) == buchstabe ) {
					ratewort[i] = buchstabe;
				}
			}
		}
		
		System.out.write( ratewort );
		System.out.println();
		System.out.println( "Sie haben gewonnen!" );
	}
	
	public static boolean equal( String s1, byte[] s2 ) {
		if ( s1.length() != s2.length )
			return false;
		
		for ( int i=0; i < s2.length; i++ ) {
			if ( s1.charAt(i) != s2[i] ) {
				return false;
			}
		}
		
		return true;
	}
}
```

Ich kann nicht nachvollziehen warum du hier einen StringBuffer verwendest, wo du doch die exakte Länge des Ratewortes weißt?


----------



## SlaterB (29. Mai 2009)

du kannst nicht nachvollziehen, warum ein Anfänger nicht ein byte[] anstelle eines String/ StringBuilders verwendet 
und dann nicht am Ende System.out.write() benutzt? 

wie soll man denn darauf kommen, hätte ich persönlich auch nicht gemacht


----------



## heart_disease (29. Mai 2009)

Was spricht dagegen? Der Performance schadet es sicher nicht ^^


----------



## java-anfaenger (29. Mai 2009)

heart_disease hat gesagt.:


> Wie wär's denn damit?
> 
> ```
> public static boolean equal( String s1, byte[] s2 ) {
> ...



kannst du mir den code erklären?


----------



## heart_disease (29. Mai 2009)

Selbstverständlich 

Wie du vlt. schon weißt, ist ein String intern nichts anderes als ein Array von Zahlen. Jede dieser Zahlen repräsentiert ein eigenes Zeichen. Welche Zahl welches Zeichen repräsentiert kann man in der ASCII-Codetabelle nachlesen.

Meine statische Methode equal() vergleicht zwei Zeichenketten miteinander und gibt _true_ zurück wenn sie inhaltlich ident sind - ansonsten wird _false_ zurückgegeben.


```
if ( s1.length() != s2.length )
    return false;
```
Wenn die Länge der beiden Zeichenketten nicht übereinstimmt können sie unmöglich gleich sein, daher wird in diesem Fall sofort _false_ zurückgegeben.


```
for ( int i=0; i < s2.length; i++ ) {
            if ( s1.charAt(i) != s2[i] ) {
                return false;
            }
        }
```

Die Schleife wird sooft wiederholt bis jedes einzelne Zeichen miteinander verglichen wurde. Die Typen *byte* und *char* werden in Java zwar unschieden, sind in Wahrheit aber dasselbe. Ein *char* (engl. Character: Zeichen) ist nämlich genau ein Byte groß. Deswegen kann der Rückgabewert von *charAt()* auch problemlos mit der Zahl aus dem byte-Array verglichen werden. Sobald ein Zeichen nicht dem anderen gleicht, wird die Methode mit _false_ beendet. Erst wenn beide Zeichenketten erfolgreich miteinander verglichen wurden wird _true_ zurückgegeben.

Btw.: Du kannst aus einem byte-Array auch einfach einen String machen: 
	
	
	
	





```
byte[] bytes = new byte[]{ 'h', 'a', 'l', 'l', 'o' };
String s = new String( bytes );
```


----------



## java-anfaenger (30. Mai 2009)

Vielen Dank!


----------

