Warnung! Passt auf mit askChar

http://pp.info.uni-karlsruhe.de/lehre/W ... rn/b03.pdf
Antworten
Rob
Beiträge: 16
Registriert: Do 23. Okt 2008, 18:01
Wohnort: Pfinztal
Kontaktdaten:

Warnung! Passt auf mit askChar

Beitrag von Rob »

Hey jungs


Ich habe grad eben das Üblatt fertig gekriegt, aber ich wollte euch warnen... Wenn ihr mal lustig drauf seit und in eurer main Methode sowas reinbastelt:

Code: Alles auswählen

Choose your action:
p : Place ship
d : Drop bomb
s : Show field
> 
Dann passt bitte auf dass ihr nicht die Abfrage macht mit Terminal.askChar(...)!
Für Anfänger: Das macht alles kaputt! Nicht tun!
Für Profis: Das liegt daran, dass diese Methode nur einen char aus dem input Stream liest, und somit das \0 noch im stream reinlässt. Bei der nächste input-abfrage findet das Programm noch das \0 im Stream und denkt dass schon was eingegeben wurde, und macht dann lustig weiter mit eine falsche Eingabe.

Für alle wieder:
Wenn ihr aber echt einen character als Eingabe haben wollt, dann könnt ihr das so machen:

Code: Alles auswählen

String input = Terminal.askString("> ");
input = input.substring(0,1).toLowerCase();

if ( input.equals("p") )
{ ... }
else if ( input.equals("d") )
{ ... }
// etc
Die zweite Zeile ändert den input String, er macht aus ihm ein neuer String der nur der erste eingabe Buchstabe enthält, und zwar kleingeschrieben.


Ich weiß nicht ob das auch einfacher geht, ich bin schließlich eher n C++ typie.. Da kann man mit dem arrayoperator einfach auf einzelne chars zugreifen. Wenn sowas auch in Java möglich ist würd ich gerne darüber erfahren...


Edit
Alternative:

Code: Alles auswählen

// Lese das erste Zeichen der Eingabe
char choice = Terminal.askString(">").charAt(0);
// Sorge dafuer, dass das Zeichen kleingeschrieben ist
choice = Character.toLowerCase(choice);

// Aktionen: Entweder mit if else...
if ( choice == 'a' ) {
    ...
} else if ( choice == 'b' ) {
    ...
} else {
    ...
}

// ... oder mit switch case
switch ( choice ) {
    case 'a':
        ...
        break;
    case 'b':
        ...
        break;
    default:
        ...
}
Zuletzt geändert von Rob am Mo 8. Dez 2008, 18:22, insgesamt 1-mal geändert.
Bild Bild
Nukleus
Beiträge: 27
Registriert: Mi 12. Nov 2008, 18:44

Re: Warnung! Passt auf mit askChar

Beitrag von Nukleus »

Das erinnert mich irgendwie stark an ein aehnliches Problem mit std::cin/getline unter C++, schoen dass nicht nur C++ da einiges kompliziert macht ;)
Benutzeravatar
salami
Beiträge: 179
Registriert: Mi 5. Nov 2008, 22:41
Wohnort: Karlsruhe

Re: Warnung! Passt auf mit askChar

Beitrag von salami »

Ich hab das zuerst so gelöst, dass ich einfach Zahlen mit aksInt einlese (0: Beenden, 1: neues Schiff, ...).
Jetzt hab ich aber wieder alles raus gelöscht, weil mein Tutor meinte, dass man keine Benutzereingabe machen soll...
Benutzeravatar
GoukipK
Beiträge: 11
Registriert: So 2. Nov 2008, 23:03
Kontaktdaten:

Re: Warnung! Passt auf mit askChar

Beitrag von GoukipK »

salami hat geschrieben:Ich hab das zuerst so gelöst, dass ich einfach Zahlen mit aksInt einlese (0: Beenden, 1: neues Schiff, ...).
Jetzt hab ich aber wieder alles raus gelöscht, weil mein Tutor meinte, dass man keine Benutzereingabe machen soll...

Aber es ist doch auch nicht verboten, oder? So kann man wenigstens ein bisschen selbst seine Schiffe sprengen :P

Und wegen dem Char einlesen. Ich erinnere mich in C++ flush() benutzt zu haben um den eingelesenen String wieder zu löschen,
damit klappte das wieder.
Allerdings hab ich bisher nicht geschaut wie das in java geht ;)
Rob
Beiträge: 16
Registriert: Do 23. Okt 2008, 18:01
Wohnort: Pfinztal
Kontaktdaten:

Re: Warnung! Passt auf mit askChar

Beitrag von Rob »

C++ hatte indertat eine ähnliche Falle für Anfänger, mit std::cin. std:.cin ist vom typ std::istream, und auf dem kann man flush() aufrufen um den Stream zu leeren.

Da Terminal aber eine Klasse ist, die uns (Anfänger ;) ) das Leben einfacher machen soll (und da Java soweit ich weiß keinen flush() für den input-stream hat), würde ich bei der Methode askChar erwarten, dass sie nur einen char abfragt, und nicht noch irgendwelche dreckige Sachen im Stream lässt. Ich werde es mal in der Newsgroup posten, gucken was am andere Ende rauskommt :D
Bild Bild
Antworten

Zurück zu „Blatt 3 - Abgabe 12.12.08“