wsort

Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.

wsort
Ich speichere in der wsort eine Zeile in “word” und alles zeilen zusammen in “words”.
Bei words bekomme ich aber einen seg fault und verstehe absolut nicht warum.
Am anfang allokiere ich words=malloc(sizeof(char *)), in der Schleife mit words=realloc(words, (i+1)*sizeof(char )) nach 4 einglesenen wörtern bekomme ich einen seg fault. Wenn ich allerdings zu beginn words mit 20sizeof(char *) allokiere und realloc auskommentiere bekomme ich logischerweiße auch einen segfault aber erst später. Heißt beim realloc geht was kaputt, aber was?

LG


Wirf mal valgrind drauf und guck mal ob da was hilfreiches raus kommt.

1 Like

eine Frage: habe ich das richtig verstanden das wir gcc mit -Wall und -Werror ausfuehren sollen um wirklich alle Fehler im program m eliminieren zu koennen?

Edit: Ziehe Frage zurueck… grade Uebungs Unterlagen aufgeschlagen, da stehts ja drin. manchmal sollte man erst lesen, dann schreiben :wink:


Das wär ja cool. „gcc, mach dass mein Programm stimmt!“ Was Prof. Schröder wohl dazu sagt? :smiley:


Dazu gibts die beruehmten Torvalds-Tests 1 & 2:

  • compiles
  • looks good

=> ship it!

Compiler-Warnungen sind einfach die billigste, einfachste Variante ein paar automatische Tests fuer gewisse Probleme ablaufen zu lassen. Natuerlich ist das bei weitem nicht perfekt, aber besser als nix.


meine natürlich um fehler zu finden und dann eliminieren zu können…

Ne frage: ist es zulässig sich das enede von einem Array mit einer speziellen Zeichenkette zu markieren? um. Z.B. bei ner While schleife darauf zu prüfen?


C-Strings sind ja nichts anderes als “Arrays, deren Ende mit einem speziellen Zeichen ([m]‘\0’[/m]) markiert wurden”. Falls du also Strings mit solchen Bytes trennen wollen würdest, wäre das okay. Allerdings solltest du davon absehen, andere Zeichen, die in einem String vorkommen können, zu verwenden. Oder meinst du etwas anderes?


ich mein eher sowas:


char c[10][10];
c[10][0] = '\0'; //markiert das Ende des Arrays
while(c[x][y] != '\0'){}

Kann man machen, ist auch unter gewissen Umstaenden nicht unueblich. Wenn man aber, wie in deinem Beispiel, die Groesse weiss, ist es schoener einfach die Groesse zu nehmen. In deinem Beispiel ist ausserdem noch die Reihenfolge eventuell gefaehrlich, denn es macht da einen grossen Unterschied ob man zuerst in y-, dann in x-Richtung oder andersrum laeuft.


while(fgets(tmp, 103, stdin) != NULL)

habe folgendes Problem. ich lese von fgets ein, aber sobald mehr als 103 zeichen eingegeben werden, so werden die fehlenden zeichen in einem neuen while durchgang “nachgeschoben”. sowas wie fflush() gibt es ja nicht für stdin. wie krieg ich es hin das nicht die Zeichen aus dem puffer nachgeschoben werden und dadurch die while schleife gleich nochmal durchgeführt wird?


Indem du die Zeichen selbst ausliest. :slight_smile:

Du musst dir Gedanken machen, wie du erkennen kannst, ob die aktuelle Eingabe „zu lang“ war. Wenn du das erkannt hast, kannst du z.B. mittels [m]getchar()[/m] so lange einzelne Zeichen einlesen, bis das tatsächliche Ende der Zeile erreicht ist.


schade. :frowning: dachte ich würde drum rumkommen, das tun zu müssen.


also, ich bin mir nicht ganz sicher, ob ichs richtig verstanden hab:

ich lese ein wort ein. dann prüfe ich, ob es von der länge her passt.
wenn es passt, schmeiß ich es irgendwie (wie?) in ein array für die ganzen wörter die sortiert werden sollen.
wenn nicht…muss ich das nächste wort einlesen. aber wie komme ich dann an den anfang des nächsten wortes? also dass es dann da wieder das einlesen anfängt?
und das mach ich solange bis ich am ende der datei bin?

bin etwas hilflos :frowning:


Lies dir die Aufgabenstellung nochmal genauer durch, da steht auch schon ein Hinweis auf fgets (man-page anschauen). Du musst dir außerdem ja nicht wirklich die wörter direkt in ein array speichern, sondern es reichen ja die pointer auf die “wörter”… :wink: