User Input wird übersprungen?!

Reb00t

Mitglied
Hallo Leute!

Zum üben habe ich ein Programm geschrieben dass einen eingegebenen Text mit der
Caesar-Verschlüsselung chiffriert. Der Code für die Chiffrierung funktioniert auch, allerdings
habe ich seltsamerweise ein anderes Problem. Zunächst mein Code

Java:
import java.util.Arrays;


public class CaesarChiffre {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		System.out.println("En- oder Decrypten? (E/D)");
		char c = SavitchIn.readChar();

                /* TESTINPUT
		System.out.println("test");
		String test = SavitchIn.readLine();
		*/

		if(c == 'E') {
			String text;
			String textEn;
			int n;
			
			System.out.println("Welcher Text soll Encrypted werden?");
			text = SavitchIn.readLine();
			
			System.out.println("Um wieviel Zeichen soll verschoben werden?");
			n = SavitchIn.readLineInt();
			
			int[] classRing = new int[26];
			textEn = "";
			
			for(int i = 0; i < classRing.length; i++){
				classRing[i] = (char)(i+97);
			}
			
			for(int i = 0; i < text.length(); i++){
				int index = Arrays.binarySearch(classRing, text.charAt(i));
				textEn = textEn.concat(String.valueOf((char)(classRing[(index+n) % 26])));
			}
			
			System.out.println("Encrypteter Text: " + textEn);
			
		} else if(c == 'D') {
			
		} else {
			System.out.println("Error!");
		}

	}

}

Zuerst frage ich also ob ein Text En- oder Decrypted werden soll. Soweit so gut.
Jetzt fängt aber das Problem an. Sobald ich mit dem ersten Input "E" in die If-Abfrage
springe erhalte Ich folgenden Ouput:

Code:
En- oder Decrypten? (E/D)
E
Welcher Text soll Encrypted werden?
Um wieviel Zeichen soll verschoben werden?

Das heisst, mein erster Input wird einfach übersprungen und er fragt direkt nach der zeichenverschiebung.
(Das habe ich schon getestet. Ein Integer wird verlangt wenn ich Versuche einen String einzugeben.)

Wenn Ich nun den oben auskommentierten Teil 'Test Input' wieder in den Code aufnehme bekomme ich
folgenden Input:

Code:
En- oder Decrypten? (E/D)
E
test
Welcher Text soll Encrypted werden?

Das heisst ich bekomme den test Output, der test Input wird übersprungen und er springt diesmal
direkt zu meinem gewollten Input und alles funktioniert wie es soll. Kann sich irgendjemand erklären warum?

Die SavitchIn Klasse ist eine Klasse die uns mein Dozent zur Verfügung gestellt hat und ist
äquivalent zu jeder anderen Input Methode. Hier geht es lediglich um den Komfort und der Fehler
liegt sicherlich nicht hier.

lg, Reb00t
 
SavitchIn ? ist sicherlich kein komfort sondern eher faulheit ... faultheit es richtig zu lernen ... vermutlich aus dem grund das es dein dozent selbst einfach nicht (richtig/besser) kann ...

und deinem output und dem code zufolge könnte man schon vermuten das der fehler in eben dieser "Helper-Klasse" zu finden ist ...

allgemein rate ich jedem von diesen möchtegern-helpern grundsätzlich ab ...

nutze SE-klassen wie Scanner oder bau es mit System.in selbst ... aber lass die finger von so nem schrott ...
 
SavitchIn ? ist sicherlich kein komfort sondern eher faulheit ... faultheit es richtig zu lernen ... vermutlich aus dem grund das es dein dozent selbst einfach nicht (richtig/besser) kann ...

[OT]Wie ich mir das Vorstelle: Student bewirbt sich bei einer Firma als Java-Programmierer und soll etwas kleines schreiben, hat aber keine Ahnung wie er das tun soll weil ihm die Helper-Klassen fehlen die er im Studium hatte 😀[/OT]
 
genau DAS denk ich mir auch immer =D ...
stell dir mal vor : riesen team-projekt ... 20 leute oder mehr in einzelnen gruppen ... und er schreibt ne rund-mail : "sagt mal leute, hat einer von euch zufällg IO.class rumliegen ?" ...

aber wie man es kennt : sowas kommt dann meist vom dozent kaliber blueJ und selbst nur als nebenfach mit 0 plan ...
 
mit Scanner wäre es aber genau das gleiche, das ist schon von 'Natur' aus etwas schwierig

der User tippt 'E' und Enter, das ist die erste Eingabe, erste Zeile, eine ganze readLine()-Sache,
mit readChar() wird das 'E' davon abgespalten, aber der Scanner ist immer noch in der ersten Zeile,
das nächste readLine() liefert den Rest davon, auch wenn das nicht besonders viel ist

also:
nach dem readChar() noch ein readLine() setzen um 'den Rest der Zeile' zu verarbeiten,
erst danach mit readLine() für 'Welcher Text soll Encrypted werden?' lesen

noch besser:
auf readChar(), readInt() und alle möglichen Späße verzichten,
aus zeilenorientierten Eingaben wie Dateien, Konsole usw. IMMER nur ganze Zeilen mit readLine() bzw. ähnlichem lesen
und diese gegebenenfalls im Detail aufsplitten

hier wäre es ja auch leicht, auf eine Eingabezeile "E" statt char 'E' zu prüfen

interessant klingt readLineInt(), das scheint das Problem zu berücksichtigen und trotzdem gleich einen int zurückzugeben, gut,
gibt es auch readLineChar() statt readChar() für den Anfang?
 
SavitchIn ? ist sicherlich kein komfort sondern eher faulheit ... faultheit es richtig zu lernen ... vermutlich aus dem grund das es dein dozent selbst einfach nicht (richtig/besser) kann ...

mit solchen Vermutungen wäre ich vorsichtig. 99% der Dozenten und Profs die ich erlebt habe (standard IHK Ausbildung, BA, FH, TU) legen einem nahe, sich wiederkehrende Helfer-Klassen anzulegen (ganz besonders für .in und .out), weil man während der Ausbildung diese so oft schreiben muss, dass man später keine Zeit dafür hat. Da wir nicht wissen wie es um dieses SavitchIn bestellt ist, ist es ziemlich frech, jemand pauschal Faulheit zu unterstellen.

und deinem output und dem code zufolge könnte man schon vermuten das der fehler in eben dieser "Helper-Klasse" zu finden ist ...

ist auch meine Vermutung

allgemein rate ich jedem von diesen möchtegern-helpern grundsätzlich ab ...

nutze SE-klassen wie Scanner oder bau es mit System.in selbst ... aber lass die finger von so nem schrott ...

pauschal zu sagen solche Helferklassen sind schrott, ist genauso falsch, wie diese blind und pauschal einzusetzen.
 
pauschal zu sagen solche Helferklassen sind schrott, ist genauso falsch, wie diese blind und pauschal einzusetzen.
'Schrott' ist in jedem Fall, sie hier nicht zu posten, nicht darüber nachzudenken dass andere sie nicht kennen,
ergo sie als Allgmeinwissen vorauszusetzen, das überspringt den Punkt von
'sinnvoller Trennung in Klassen zur Code-Vermeidung' hin zu
'gar nicht mehr nachdenken was das ist, wie das arbeitet, einfach eine beliebige wichtige Methode wie System.out.println()'

aber dann lernt man es eben in diesem Thema hier
 
Niemand sagt, dass Helper-Klassen Allgemein schrott sind. Allerdings lernt man beim nutzen dieser Klassen die vom prof bereitgestellt werden nicht wirklich den umgang ohne, sodass man nach dem Studium nicht in der Lage ist ohne diese zu arbeiten geschweige denn sich selbst eine solche zu schreiben da das arbeiten mit z.B. System.in garnicht gelehrt wird.
 
Man jetzt weiß ich was für schlechte Profs bzw Dozenten ich hatte, die haben uns keine solche Helferklassen gegeben, wir mussten es immer über System.in und so machen :-(
 
Hallo?

Ich hab keinen bock mit euch drüber zu diskutieren ob das nun gut ist oder nicht.
Fakt ist ich benutze Sie und werde Sie auch weiter benutzen. Und der Fehler liegt
wie gesagt nicht in dieser Klasse, weil die Klasse in allen anderen Beispielen immer
das getan hat was Sie sollte.

Ein einfaches 'Ich kann mir leider selber nicht erklären warum und weshalb...' hätte
gereicht aber gleich eine Diskussion anzubrechen in der Dozenten als unfähig und
faul beschrieben werden ist sicherlich weniger Produktiv als diese Klasse zu verwenden!

lg
 
Wenn die Klasse so toll funktioniert, warum Fragst du?
Wenn du die Klasse schon so oft richtig verwendet hast, warum Fragst du?
...
Scheinbar ist entweder die BENUTZUNG dieser Klasse nicht so toll, einfach, bekannt,... dann nimm die Ratschläge an, aber bei Fremden Klassen, können WIR dir nicht sagen, was sich der IMPLEMENTIERER der Klasse gedacht hat ohne diese Klasse zu sehen.

Das ist schon eine falsche Einstellung, man sollte nicht immer irgendwelche Workarounds nehmen, wenn man es richtig lernen will, wenn du Java nur hast, als sagen wir Germanistikstudent, dann ok, weil dann wirst du es nie brauchen, dann macht das nix.
 
http://cseweb.ucsd.edu/users/savitch/java/SavitchIn.txt

readLineNonwhiteChar()
gibt es übrigens,

und bei readChar() steht noch extra dran
/************************************************************
*Reads the next input character and returns that character. The
*next read takes place on the same line where this one left off.

***********************************************************/
public static char readChar()


edit:
und noch ein Quote:
/****************************************************************
*Class for simple console input.
*A class designed primarily for simple keyboard input of the form
*one input value per line
. If the user enters an improper input,
*i.e., an input of the wrong type or a blank line, then the user
*is prompted to reenter the input and given a brief explanation
*of what is required. Also includes some additional methods to
*input single numbers, words, and characters, without going to
*the next line.

***************************************************************/
 
Zuletzt bearbeitet von einem Moderator:
Ja, habs schon gesehen danke!

Gegen Offtopic habe ich nichts, aber ich habe etwas dagegen wenn jemand
meint aus einem Post von mir meine Gesamte Motivation, mein Können und
das Können meines Dozenten herauslesen kann. Das ist mir schon in anderen
Programmierforen aufgefallen.
Da kriege ich echt die Kotzerei, weil es einfach absolut unproduktiv ist und weder
mir noch der Person XY hilft. Und mir dadurch vor allem Dinge unterstellt werden
die zu 100% nicht zutreffen ^^

Anstatt zu sagen, dass helper Klassen s******e sind kann man ja einfach die
in seinen Augen bessere Lösung posten, sonst muss ich davon ausgehen, dass
der Kritiker selber nicht mit der Materie umgehen kann.

so long...
 
Reb00t DIR hat hier NIEMAND etwas unterstellt.
Wenn du es so beigebracht bekommst dann ist das halt so.
Leider wirst du aber NACH deiner Studienzeit mit deiner Helper-Klasse im "realen" Java nicht sehr weit kommen. Dozenten nutzen diese Helper-Klassen da es einfacher und schneller beizubringen ist, leider lernst du aber dabei das arbeiten ohne diese Klassen nicht.
 
weil es einfach absolut unproduktiv ist und weder
mir noch der Person XY hilft. Und mir dadurch vor allem Dinge unterstellt werden
die zu 100% nicht zutreffen ^^
deiner Interpretation nach, was nicht die Allgemeinmeinung sein muss,
welche natürlich auch nicht richtig sein muss, aber ein einzelner überzeugt kaum 10 andere 😉
Anstatt zu sagen, dass helper Klassen s******e sind kann man ja einfach die
in seinen Augen bessere Lösung posten, sonst muss ich davon ausgehen, dass
der Kritiker selber nicht mit der Materie umgehen kann.
Kritik geht immer ohne besseren Lösungsweg, soviel ganz allgemein,
Krieg und Staatschulden sind doof zu nennen ohne gleich die Universallösung zu haben

wobei in diesem Fall wie so oft die Alternative auf der Hand liegt: das Einlesen selber programmieren bzw. gleichbedeutend die andere Klasse mitzuposten, darüber nachdenken was dabei passiert

deine Aussage zuvor
Und der Fehler liegt wie gesagt nicht in dieser Klasse, weil die Klasse in allen anderen Beispielen immer das getan hat was Sie sollte.
zeigt wunderbar genau das Problem,
natürlich enthält die Eingabe-Klasse keinen direkten Bug, aber deine Verwendung derselben achtet nicht auf alle Rahmenbedingungen,
siehe ja auch die Quotes in meinem Posting zuvor bzw. Beitrag #5 mit vollständiger Erklärung
 
ganz erlich : der code und der dazugehörige output zeigen das die klasse SavitchIn entweder nicht so programmiert wurde wie es die methoden-namen erahnen lassen ... oder du diese einfach nicht entsprechend verwendest ... aber egal wie man es dreht und wendet : würdest du einfache SE-klassen wie eben z.b. Scanner mit System.in nutzen oder dir z.B. mit einem der häufig anzutreffenden standard-konstrukte a la [c]BufferedReader in=new BufferedReader(new InputStreamReader(System.in));[/c] einfach deinen eigenen "helper" bauen und darauf schlicht "readLine()" callen und den input verarbeiten ... hättest du diese probleme nicht ...


auch habe mich hier einige stark missverstanden ...

ich habe nie behauptet das allgemein ALLE helper-klassen schrott sind ... nur das was hier , und wie es aus euren posts kommt ja scheinbar überall , passiert ist einfach absoluter bullshit ...

wie erwähnt : den schülern werden diese möchtegern-helper "aufgezwungen" anstatt mal kurz und bündig darauf einzugehen wie man es mit BufferedReader oder Scanner "richtig" macht ... und dann eventuell sogar noch schlechte noten verteilen wenn man nur SE-klassen nutzt anstatt diesen schrott ...

was daraus folgt wurde auch genannt : auf grund fehlenden wissens über eben solche basis-grundlagen wie man daten von der console liest und auf dieser wieder ausgibt kann es später zu schweren wissenslücken führen ... das reicht dann von "ich kann keine consolen-apps entwickeln weil ich nicht weis wie" bis hin zu "netzwerk und streams ? was is das denn" ...

und ja ... es ist aber nun mal leider traurige wahrheit das eben diese 99% aller dozenten die eben so schlecht mit ihren schülern umgehen schlicht faul und teilweise auch einfach nur dumm sind ... und zwar aus dem grund da richtige info-studien fehlen und "informatik" meist nur als nebenfach belegt wird weil man im gegensatz zum restlichen kollegium dann doch wenigstens weis wie so n ding angeht ...


und ich finde schon das wir eigentlich genau dafür da sind ... um auf solche missstände und fehler hinzuweisen und einem anfänger klar zu machen das man sowas eben nicht machen sollte ... sonst setzt sich das fest und man hat später probleme ...

um es also mal in "SE-API" zu schreiben

Java:
import java.util.*;
public class CaesarChiffre
{
	public static void main(String[] args) throws Exception
	{
		Scanner scanner=new Scanner(System.in);
		System.out.println("En- oder Decrypten? (E/D)");
		String selection=scanner.readLine();
		switch(selection)
		{
			case "E":
				String text;
				String textEn;
				int n;
				System.out.println("Welcher Text soll Encrypted werden?");
				text=scanner.readLine();
				System.out.println("Um wieviel Zeichen soll verschoben werden?");
				n=Integer.parseInt(scanner.readLine());
				StringBuilder stringBuilder=new StringBuilder(text.length());
				for(int i=0; i<text.length(); i++)
				{
					char current=text.charAt(i);
					current+=n;
					if(current>126)
					{
						current-=95;
					}
					stringBuilder.append(current);
				}
				System.out.println("Encrypteter Text: " + stringBuilder.toString());
				break;
			case "D":
				//TO-DO
				break;
			default:
				System.out.println("ERROR");
		}
	}
}

ist zwar jetzt nur für ASCII 32 - 126 ... aber sollte schon zeigen wie man es richtig umsetzen sollte

@TO
so .. und bevor du dich weiter beschwerst von wegen ich soll lieber was "besseres" post anstatt mich nur über deinen code aufzuregen : im gegensatz zu dir kann ich sowas alles und weis wie es "richtig" geht ...

und ja : man KANN anhand deines codes , deines outputs und deiner fragen sehr gut sowohl deinen wissensstand als auch den dessjenigen der es versucht dir beizubringen erkennen ... denn ein dozent dem etwas daran liegt seinen schülern java richtig beizubringen würde nie auf solchen schrott zurückgreifen ... und glaub mir ... da kenn ich mehr als genug die so qualifiziert sind das sie aus dem oben gennnten raster rausfallen ...
 

Zurück
Oben