Denne
Here to stay
|
Hey Ihrs! ich bin relativ am verzweifeln, weil ich nicht verstehe, wieso Java da so nen Mist macht bzw was ich falsch mache. Hier der Code package uebung07;
import static gdi.MakeItSimple.*;
public class Tests {
/**
* @param args
*/
public static void main(String[] args) {
int int1=0, i=0;
// Hier wird das erste Array erstellt
println("Tippen sie bitte ein, was im ersten Array stehen soll!");
String eingabe1 = readLine();
println("Geben Sie bitte die Länge des ersten Arrays an!");
int1 = readInt();
while(eingabe1.length() > int1){
println("Das Array ist zu kurz für Ihre Eingabe, bitte geben sie " +
"neue Werte ein.");
println("Tippen sie bitte ein, was im ersten Array stehen soll!");
eingabe1 = readLine();
println("Geben Sie bitte die Länge des ersten Arrays an!");
int1 = readInt();
}
char [] array1 = new char[int1];
while (i<eingabe1.length()){
array1 [i] = eingabe1.charAt(i);
i++;
}
println(eingabe1);
println(eingabe1.charAt(3));
i=0;
while(i<array1.length){
print(array1[i]);
i++;
}
}
}
Die Ausgabe in der Konsole: Tippen sie bitte ein, was im ersten Array stehen soll!
Hallo
Geben Sie bitte die Länge des ersten Arrays an!
3
Das Array ist zu kurz für Ihre Eingabe, bitte geben sie neue Werte ein.
Tippen sie bitte ein, was im ersten Array stehen soll!
Geben Sie bitte die Länge des ersten Arrays an!
Wieso überspringt er die zweite readLine() Eingabe !? Kann mir bitte wer erklären, was ich falsch mache? tia :/
Bearbeitet von Denne am 24.11.2008, 16:09
|
Nico
former person of interest
|
gib die werte einfach mal in der konsole aus bevor du sie vergleichst
|
Denne
Here to stay
|
gute Idee, ich werds mal machen. edit: println("Tippen sie bitte ein, was im ersten Array stehen soll!");
String eingabe1 = readLine();
println(eingabe1);
println("Geben Sie bitte die Länge des ersten Arrays an!");
int1 = readInt();
println(int1);
while(eingabe1.length() > int1){
println("Das Array ist zu kurz für Ihre Eingabe, bitte geben sie " +
"neue Werte ein.");
println(eingabe1);
println("Tippen sie bitte ein, was im ersten Array stehen soll!");
eingabe1 = readLine();
println(eingabe1);
println(int1);
println("Geben Sie bitte die Länge des ersten Arrays an!");
int1 = readInt();
println(int1);
Konsole Tippen sie bitte ein, was im ersten Array stehen soll!
Hallo
Hallo
Geben Sie bitte die Länge des ersten Arrays an!
6
6
Tippen sie bitte ein, was im zweiten Array stehen soll!
Geben Sie bitte die Länge des zweiten Arrays an!
wtf !? Ich raffs einfach net
Bearbeitet von Denne am 23.11.2008, 17:02
|
Nico
former person of interest
|
du hast nicht den wert im vergleich genommen, sondern den ganzen string. interessant ist nicht eingabe1, sondern eingabe1.length().
|
that
Hoffnungsloser Optimist
|
Wieso überspringt er die zweite readLine() Eingabe !? Vermutlich weil du nach der Zahl auf "Enter" drückst und das von readInt() nicht gelesen wird?
|
Nico
former person of interest
|
that, wird deine vermutung nicht durch die ausgabe widerlegt ?
|
Denne
Here to stay
|
du hast nicht den wert im vergleich genommen, sondern den ganzen string. interessant ist nicht eingabe1, sondern eingabe1.length(). ich verstehe nicht, was du damit meinst, sorry :/
|
Nico
former person of interest
|
ich meine, gib eingabe1.length() aus zur kontrolle, nicht eingabe1.
|
Denne
Here to stay
|
ah okay, wird gemacht! Und hier wieder das Ergebnis // Hier wird das erste Array erstellt
println("Tippen sie bitte ein, was im ersten Array stehen soll!");
String eingabe1 = readLine();
println(eingabe1);
println(eingabe1.length());
println("Geben Sie bitte die Länge des ersten Arrays an!");
int1 = readInt();
println(int1);
while(eingabe1.length() > int1){
println("Das Array ist zu kurz für Ihre Eingabe, bitte geben sie " +
"neue Werte ein.");
println(eingabe1);
println(eingabe1.length());
println("Tippen sie bitte ein, was im ersten Array stehen soll!");
eingabe1 = readLine();
println(eingabe1);
println(eingabe1.length());
println(int1);
println("Geben Sie bitte die Länge des ersten Arrays an!");
int1 = readInt();
println(int1);
}
char [] array1 = new char[int1];
while (i<eingabe1.length()){
array1 [i] = eingabe1.charAt(i);
i++;
}
Konsole: Tippen sie bitte ein, was im ersten Array stehen soll!
Hallo
Hallo
5
Geben Sie bitte die Länge des ersten Arrays an!
4
4
Das Array ist zu kurz für Ihre Eingabe, bitte geben sie neue Werte ein.
Hallo
5
Tippen sie bitte ein, was im ersten Array stehen soll!
0
4
Geben Sie bitte die Länge des ersten Arrays an!
Nach dem letzten "Tippen sie bitte ein, was im ersten Array stehen soll!" kommt eine Zeile nichts (leerer String?) und die Länge der Eingabe beträgt wohl 0... Schön und gut, aber ich müsste an der Stelle was eingeben können. Er überspringt einfach die Eingabe und der neue String ist einfach leer. Aber wieso ?
Bearbeitet von Denne am 23.11.2008, 18:06
|
Maekloev
linux addicted
|
wenn du mir ganz kurz erklärst, was das programm genau bewirken soll, schreib ich dir schnell eine version, welche dasselbe bewirkt. ich vermute nämlich, dass das, was du da vorhast, sich auch wesentlich kürzer schreiben lassen würde.
hast du vor, einen string von der konsole einzulesen und diesen dann zu speichern? Brauchst du ihn in einem char-array? falls ja, dann lassen sich strings auch einfach in ein char-array konvertieren.
|
that
Hoffnungsloser Optimist
|
Schön und gut, aber ich müsste an der Stelle was eingeben können. Er überspringt einfach die Eingabe und der neue String ist einfach leer.
Aber wieso ? Du hast offenbar weder meine Antwort im Thread gelesen noch die Anleitung zu deiner IO-Library. Reduziere dein Programm testweise so lange, bis dir klar ist, was genau das Problem ist, dann kannst du es auch beheben.
|
Maekloev
linux addicted
|
ok, ich hab mir jetzt mal die mühe gemacht, ein einfaches programm zu schreiben, das einen string einliest und diesen auf mehrere arten ausgibt. dabei verwendet die main-methode zwei static-methoden. immer schön alles in einzelne methoden schreiben (prinzip einer einzigen verantwortung). für den input habe ich einen Scanner verwendet, der recht einfach anzuwenden ist. hier der code: import java.util.Scanner;
/**
*
* Testet eine einfache Möglichkeit, einen String per
* Konsole über einen Scanner einzulesen. Dieser String
* wird anschließend auf vier verschiedene Arten ausgegeben.
*
*/
public class Tests {
/**
* Liest eine Zeile von der Konsole und speichert diese.
* Dazu wird ein Scanner-Objekt erstellt mit dem InputStream
* System.in. Anschließend wird dieser String zurückgegeben.
* @return Der eingelesene String.
*/
public static String getInput() {
Scanner scanner;
// Scanner benötigt einen InputStream, in diesem Fall
// eben die Konsole, also System.in
scanner = new Scanner(System.in);
System.out.print("Tippen sie bitte ein, was im ersten Array stehen soll: ");
return scanner.nextLine();
}
/**
* Gibt den eingelesenen String auf vier verschiedene
* Arten aus.
* @param input Der auszugebende String.
*/
public static void printInformation(String input) {
char [] inputCharacters;
inputCharacters = input.toCharArray();
System.out.println("\nAusgabe: ");
// Ausgabe des Strings
System.out.println(input);
// Ausgabe der Länge
System.out.println("Länge: " + input.length());
// Ausgabe des char-arrays ebenfalls möglich,
// da die toString()-Methode überschrieben ist.
System.out.println(inputCharacters);
// Ausgabe des char-arrays stückweise
for (int i=0; i < input.length(); i++) {
System.out.print(inputCharacters[i]);
}
System.out.println();
// Elegantere Version der for-Schleife (for each)
for (char c: inputCharacters) {
System.out.print(c);
}
System.out.println();
}
public static void main(String[] args) {
String input;
input = getInput();
printInformation(input);
}
}
anbei findest du noch das programm als java-sourcecode als exportiertes eclipse-projekt, falls du es testen möchtest. man sollte sich übrigens angewöhnen, programm-code sowie variablen-namen und kommentare wenn möglich auf englisch zu schreiben, was ich jedoch für diese demonstration nicht gemacht habe.
eingabe_133624.zip (downloaded 106x)
Bearbeitet von Maekloev am 23.11.2008, 18:58
|
Nico
former person of interest
|
oha, dass diese funktionen nicht richtig laufen hab ich garnicht in betracht gezogen - sorry that
|
Maekloev
linux addicted
|
aja, zu dem oben erwähnten problem mit den read-methoden folgendes: ich glaube ebenfalls, wie that bereits erwähnt hat, dass das return-zeichen im string das problem ist. in c gibt es dieses problem ja auch mit der scanf()-funktion (vgl. dazu das openbook auf galileocomputing). das problem ist hierbei die pufferung. eine möglichkeit, das problem zu lösen (sofern man wirklich scanf verwenden möchte) besteht darin, das newline-zeichen mit einer while-schleife aus dem puffer herauszuziehen. nur mal so als vergleich...
Bearbeitet von Maekloev am 23.11.2008, 19:35
|
Denne
Here to stay
|
@ that: ich dachte du meinst, ich hätte ausversehen 2 mal enter gedrückt oder ähnliches und nico meinte ja irgendwie, dass deine "theorie" widerlegt wird duch die konsole. ich hab hierfür einige testprogramme geschrieben, die nur teilstücke enthalten. die laufen alle ohne probleme, weil halt das readLine() nicht überlesen wird... Ich komme ja nicht einmal soweit das ich gucken kann, ob der string vernünftig in das array kopiert wird (im testprogramm hat das aber problemlos geklappt). @ Maekloev: Vielen Dank! Aber das Programm ist für die Hochschule und da dürfen wir nur Sachen verwenden, die wir bis dahin hatten :/ Deswegen schauts wohl auch so umständlich aus (bin noch im ersten Semester). Und um ehrlich zu sein hatten wir glaube ich nicht einmal charAt. Wie wir sonst die Aufgabe meistern sollen, ist mir ein Rätsel. Zum Programm an sich: Ich habe nur ein Ausschnitt gepostet. Der Benutzer soll einen String eingeben, welches Zeichen für Zeichen in ein Char-Array kopiert wird. Hierbei darf der Benutzer aber bestimmen, wie lang das Array sein soll (deswegen die while-schleife die den fall abfängt, dass das array zu klein ist). Mit dem Array wird dann noch weitergearbeitet, das ist aber ersteinmal egal Hoffe, man verstehts :/ edit: Die Lösung: Um nach dem ersten readInt() das Leerzeichen bzw Enter wegzubekommen, setzen wir einfach danach ein leeres readLine() und somit funzt alles Danke für die Tipps (wie einfach dann die Lösung doch war... ) Gruß Denne
Bearbeitet von Denne am 24.11.2008, 10:49
|