Wörter in 2D Array einlesen - C |
24.11.2015, 15:06 | Auf diesen Beitrag antworten » | ||||||||||
LightSideOfLife | Wörter in 2D Array einlesen - C Hallo Leute! Erstmal: ich bin ganz neu hier Razz Ich studiere derzeit Elektrotechnik und versuche mich gerade an meiner SotwareTechnik Aufgabe. Wir sollen ein Menü programmieren und dann mittels Menüpunkten bis zu 10 Wörter in ein 2 dimensionales Array einlesen und auch auslesen. Die Menüführung mit Switch Case funktioniert, aber bei scanf hapert es derzeit irgendwie... Ich glaube ich habe ein Logik/Verständnisproblem. Ich poste mal meine bisherige (noch fehlerhafte) Lösung:
Habt ihr eine Idee wo mein Problem nun liegt? Ich kriege meine Wörter nicht vernünftig eingelesen. Für Hilfe und Denkanstöße wäre ich sehr dankbar! Grüße, Marvin |
||||||||||
|
|||||||||||
24.11.2015, 17:08 | Auf diesen Beitrag antworten » | ||||||||||
eulerscheZahl | Dein Problem liegt wo anders:
und
Du solltest wortListe größer machen, aktuell geht sie nur von 0 bis 8. |
||||||||||
24.11.2015, 19:51 | Auf diesen Beitrag antworten » | ||||||||||
LightSideOfLife | Danke Hallo, danke für die schnelle Antwort! Ich hab es mittlerweile geschafft 10 Wörter einzugeben und auszugeben. Hier mein Code:
Nun habe ich aber folgende Probleme: 1.) Ich schaffe es nicht ein Wort char - weise einzulesen und auszugeben. dieses Problem führt wiederum zu: 2.) Ich soll bei der Eingabe überprüfen ob ein "q" eingegeben wurde. Falls ja soll ich das ganze unterbinden. Meine reine Eingabe und Ausgabe hab ich mit den Strings jetzt lösen kann, aber per scanf("%c", ....) schaffe ich es nicht. Grüße, Marvin |
||||||||||
24.11.2015, 20:05 | Auf diesen Beitrag antworten » | ||||||||||
eulerscheZahl | Hast du an sowas gedacht?
|
||||||||||
Anzeige | |||||||||||
|
|||||||||||
24.11.2015, 20:37 | Auf diesen Beitrag antworten » | ||||||||||
LightSideOfLife | Wow das ist eine Lösung auf die ich so nie gekommen wäre! Der erste while Vergleich ist mir nicht ganz schlüssig, vor allem da mir EOF gerade nichts sagt. Außerdem verstehe ich nicht:
Weshalb j++? Und wieso funktioniert es, dass wir dann dadrunter mit:
Das Ende unseres Strings angeben? Die Lösung scheint richtig zu sein, aber ich möchte sie nicht übernehmen ohne sie wirklich zu verstehen. Vielen Dank übrigens schonmal! |
||||||||||
24.11.2015, 20:46 | Auf diesen Beitrag antworten » | ||||||||||
eulerscheZahl | Gehen wir die Sache mal durch: Vom letzten Enter (Wahl der Zahl im Hauptmenü) hast du das Enter noch in der Eingabe hängen, das kommt bei getchar() als erstes. Das wollen wir nicht, also muss es weg, sonst ist das erste Wort schon zu Ende - einfach mal die Zeile auskommentieren und testen. EOF heißt end of file. Unter Windows kannst du die Zeile auch durch fflush(stdin) ersetzen. Dann läuft es bei mir aber nicht mehr, worüber ich nicht erfreut wäre. printf("%d. Wort: ", i+1); schreibt 1. Wort, 2. Wort, ... Dient nur der Übersichtlichkeit beim Eingeben. Dann gehen wir die Eingabe Zeichen für Zeichen durch. Wenn die Eingabe zu lang wird, brechen wir ab mit while (j < 19), da wir sonst in fremden Speicher schreiben würden. Auch beim Enter ('\n') wird abgebrochen. Anschließend noch das Zeichen schreiben, sofern kein 'q'. Gleichzeitig muss die Schreibposition mit j++ erhöht werden, sonst schreiben wir immer an die selbe Stelle. Der string wird dann noch mit '\0' (gleichbedeutend der Zahl 0) abgeschlossen. So weiß printf, wann der string zu Ende ist. Hier muss das j nicht mehr erhöht werden, da wir mit dem Schreiben fertig sind, die Schreibposition also nicht mehr ändern müssen. |
||||||||||
24.11.2015, 20:50 | Auf diesen Beitrag antworten » | ||||||||||
LightSideOfLife | Ok das verstehe ich nun. Aber damit setzen wir ja '\0' immer an "wortListe[i][20]" oder nicht? |
||||||||||
24.11.2015, 20:58 | Auf diesen Beitrag antworten » | ||||||||||
eulerscheZahl | Du meinst wortListe[i][19] Nicht, wenn der Nutzer schon vorher Enter gedrückt hat. Die while Schleife wird bei j=19 oder bei Enter verlassen. |
||||||||||
24.11.2015, 21:03 | Auf diesen Beitrag antworten » | ||||||||||
LightSideOfLife | ok das verstehe ich jetzt auch. Ich habe nun versucht auf Grundlage dessen meine Ausgabe charweise zu gestalten, da wir dir Ausgabe umdrehen sollen. Wenn ich dies tu, kriege ich zwar die Wörter aber auch irgendwas dazwischen. Das liegt daran, dass die Zeichen zwischen dem Ende des Wortes und '\0' nicht richtig definiert sind richtig? Meine Ausgabe sieht nämlich so aus:
gelöst habe ich diesen Code durch:
So richtig funktionieren tut das aber noch nicht.... Vielen Dank für die Erklärung und Geduld! |
||||||||||
24.11.2015, 21:08 | Auf diesen Beitrag antworten » | ||||||||||
eulerscheZahl | Dann geben wir eben nicht 20 Zeichen aus, sondern nur bis zum 0 Byte.
das printf("\n"); solltest du nach, statt vor die Ausgabe des strings schieben. Und ja, da steht noch irgendwas anderes im Speicher, was das letzte Programm übriggelassen hat. |
||||||||||
24.11.2015, 21:35 | Auf diesen Beitrag antworten » | ||||||||||
LightSideOfLife | Ok alles funktioniert jetzt. Wie schaffe ich es jetzt aber die restlichen undefinierten Stellen meines Arrays = '\0' zu setzen? Ich möchte meine Wörter umdrehen in der Ausgabe:
Da kriege ich dann natürlich bis auf meine eingegeben Worte auch noch irgendwas undefiniertes raus. |
||||||||||
25.11.2015, 06:13 | Auf diesen Beitrag antworten » | ||||||||||
eulerscheZahl | Zunächst einmal fängst du bei j=19 mit der Ausgabe an, nicht bei 20. Wir hatten die Zeile
Das musst du einfach wiederholen bis einschließlich j=19. |
||||||||||
25.11.2015, 12:14 | Auf diesen Beitrag antworten » | ||||||||||
LightSideOfLife | Ergebnis Ich bin nun zu diesem (funktionierenden) Ergebnis gekommen. Ich denke aber dass es noch nicht ganz optimal ist, da ich vieles durch Umwege lösen musste... Also sagen wir funktioniert, aber nicht gerade elegant
Ich habe nun aber das Problem, dass wenn ich menuPunkt einen String übergebe, mein SwitchCase in einen Loop verfällt. Woran liegt das? |
||||||||||
25.11.2015, 17:25 | Auf diesen Beitrag antworten » | ||||||||||
eulerscheZahl | Deine Lösung geht so nicht: Gib mal lange Worte ein und lasse sie ausgeben. Gib dann kurze Worte ein. Bei der Ausgabe wirst du noch den Rest des langen Wortes sehen. Wenn du den Code so anpasst, dass du beim Einlesen den Rest mit 0en überschreibst, sieht das so aus:
Und es würde mich erstaunen, wenn nicht explizit von goto abgeraten wurde. Das macht den Code unleserlich. scanf erwartet eine Zahl, kriegt aber keine. Durch Drücken von Enter hast du die Eingabe beendet. Diese bleibt noch im Buffer und wird erneut geprüft. Du kannst die Zeile while((c = getchar()) != '\n'); nach oben schieben (statt in case 1), dann wird die Eingabe entfernt. |
||||||||||
25.11.2015, 17:47 | Auf diesen Beitrag antworten » | ||||||||||
LightSideOfLife | Bei dieser Lösung überschreibt das Programm mir aber die restlichen Stellen nicht mit '\0'. Die Ausgabe spuckt mir wieder undefinierte Zeichen aus. Mein Code sieht nun so aus:
|
||||||||||
25.11.2015, 17:52 | Auf diesen Beitrag antworten » | ||||||||||
eulerscheZahl | Also, bei mir scheint es zu passen. Hast du eine Beispieleingabe? |
||||||||||
25.11.2015, 17:58 | Auf diesen Beitrag antworten » | ||||||||||
LightSideOfLife | Ich sollte erst denken und dann schreiben... Ich habe die Lösung falsch implementiert. Jetzt funktioniert es auch bei mir. Was ich aber nicht verstehe an der Lösung ist: Bricht meine break-Anweisung die Schleife ab oder geht sie dadurch wieder zu Beginn? |
||||||||||
25.11.2015, 18:01 | Auf diesen Beitrag antworten » | ||||||||||
Karlito | break unterbricht die Schleifenausführung. Um die Ausführung des Schleifenkörpers an einer bestimmten Stelle zu unterbrechen und mit der nächsten Iteration fortzufahren, wird continue verwendet. |
||||||||||
25.11.2015, 18:09 | Auf diesen Beitrag antworten » | ||||||||||
LightSideOfLife | Wenn ich nun aber einen ersten Programmdurchgang mache und bei der Eingabe mit einem q abbreche, dann bekomme ich wieder eine undefinierte Ausgabe.
und das, obwohl ich goto LOOP durch break ersetzt habe, um wieder die zweite while Schleife zu durchlaufen. |
||||||||||
25.11.2015, 18:11 | Auf diesen Beitrag antworten » | ||||||||||
eulerscheZahl | Da hast du sie ja auch noch nicht mit 0 befüllt. Geht am einfachsten mit char wortListe [10][30] = {0}; direkt bei der Variablendeklaration. |
||||||||||
25.11.2015, 18:13 | Auf diesen Beitrag antworten » | ||||||||||
Karlito | Ich halte es auch nicht für Sinnvoll, das Zeichen q in den Worten zu verbieten. Ich denke, das sollte eher beim Menü verwendet werden können, oder? |
||||||||||
25.11.2015, 18:17 | Auf diesen Beitrag antworten » | ||||||||||
LightSideOfLife | Die Aufgabenstellung sagt mir, dass ich bei Eingabe des Zeichens q eine weitere Eingabe unterbinden soll. Ich bearbeite gerade eine Übungsaufgabe. @eulerscheZahl Danke, das sieht sehr gut aus, ich werde es versuchen! |
||||||||||
25.11.2015, 18:19 | Auf diesen Beitrag antworten » | ||||||||||
LightSideOfLife | Wow, meine Lösung funktioniert jetzt super! Vielen Dank! Nur hätte ich da auch von selbst drauf kommen müssen... Ich hoffe das kommt mit der Übung. Das einzige Problem, das ich jetzt habe ist, dass ich nicht weiß wie ich ohne goto-Anweisung einen Abbruch der Eingabe erzielen kann. |
||||||||||
25.11.2015, 18:23 | Auf diesen Beitrag antworten » | ||||||||||
eulerscheZahl | Das Verlassen mehrerer Schleifen gleichzeitig ist der einzige Punkt, wo goto vertretbar ist. Aber dann setze die Sprungmarke zumindest ans Ende der Schleife, dass du mit goto nicht nach oben springst.
|
||||||||||
25.11.2015, 18:26 | Auf diesen Beitrag antworten » | ||||||||||
Karlito | Man könnte auch eine Variable verwenden, um den Kontrollfluss zu steuern. Man muss dann nur an allen relevanten Punkten den Wert der Variable prüfen. Man muss dann abwägen, wie der Quelltext leserlicher ist. Gruß, Karlito |
||||||||||
25.11.2015, 18:26 | Auf diesen Beitrag antworten » | ||||||||||
LightSideOfLife | Ok dann werde ich das so lassen und hoffen, dass mein Tutor mich nicht auseinander nimmt Alleine hätte ich das vorerst nicht so geschaftt! Ich habe auf jeden Fall was gelernt. Mein Ansatz zum Einlesen war falsch, da ich mich vorher noch nicht mit getchar() vertraut gemacht hatte. Vielen Dank! |
||||||||||
25.11.2015, 18:28 | Auf diesen Beitrag antworten » | ||||||||||
Karlito | Auch wenn ich damit Verwirrung stifte, ich würde scanf anstatt getchar verwenden. Und dann die Abarbeitung auch nur stoppen, wenn das Wort "q" eingegeben wurde, nicht bei jedem möglichen 'q'. Ich denke, das wird auch der Tutor bemängeln, aber da es quasi zum Lernen gedacht ist, wird die Lösung schon durchgehen, Gruß, Karlito |
||||||||||
25.11.2015, 18:32 | Auf diesen Beitrag antworten » | ||||||||||
LightSideOfLife | Die Lösung mit scanf war auch eigentlich meine Erdachte:
Wo liegt hier der Fehler? Dass ich jetzt buchstabenweise einlese weiß ich, aber auch mit einer Hilfsvariablen habe ich es nicht geschafft. |
||||||||||
25.11.2015, 18:37 | Auf diesen Beitrag antworten » | ||||||||||
Karlito | Ich dachte eher an:
Damit sollten ganze Wörter eingelesen werden, anstatt einzelner Buchstaben.
Gibt dabei schon einen Pointer auf den Anfang des Wortes zurück. Habe es leider nicht ausprobiert. Edit: Du müsstest also die innere Schleife weg lassen können. Gruß, Karlito |
||||||||||
25.11.2015, 19:50 | Auf diesen Beitrag antworten » | ||||||||||
LightSideOfLife | Wie kann ich denn dann nun mit dieser Lösung meine nicht "genutzten" Stellen im Array = '\0' setzen? Jetzt scan ich ja nicht mehr charweise ein sondern stringweise |
||||||||||
25.11.2015, 20:02 | Auf diesen Beitrag antworten » | ||||||||||
eulerscheZahl | scanf("%s") beendet den string auch mit '\0'. Du kannst bis zu dieser 0 gehen und den Rest dann wie vorher auch byteweise setzen. Um die '\0' zu finden gibt es auch die Funktion strlen(). scanf ist es aber egal, wenn du mehr Zeichen einliest, als du Speicher zur Verfügung hast. |
||||||||||
25.11.2015, 22:21 | Auf diesen Beitrag antworten » | ||||||||||
Karlito | Das ist nur begrenzt korrekt. Man kann die Anzahl der eingelesenen Zeichen beschränken.
sollte dafür funktionieren. S. Es gibt noch ein paar weitere Spielarten. Scheinbar kann man mit %ms beiliebig langen Text angeben und scanf kümmert sich um die Allokation... Ich denke wir müssen es hier aber nicht übertreiben. Tipp: Unter linux mal "man scanf" ins Terminal eingeben. Gruß, Karlito |
|
Verwandte Themen
Die Beliebtesten » |
|
Die Größten » |
|
Die Neuesten » |
|