Probleme mit sizeof und Länge eines Arrays
-
Ich habe ein Programm geschrieben, welches ein Wort einliest und dann aus einer Liste an Wörtern das Wort ausgibt, das alle Buchstaben des eingegebenen Wortes beinhaltet.
#include <stdio.h> #include <stdlib.h> #include <string.h> char *woerter[] = { "jana", "fenster", "eriesee", "banane", "spielzeug", "dudelsackspieler", "rasen", "strauch" }; char **woerterSort; /* Array zu den Ländern mit sortiert. Buchstaben */ /* Sortiert den übergebenen String original, wobei es diesen sortierten String in den String sortiert schreibt. Der String original bleibt unverändert */ void sortierBuchstaben(char *sortiert, char *original) { int i, u; char save; strcpy(sortiert, original); for(i=0; i<strlen(sortiert) ;i++) for(u=i+1; u<strlen(sortiert) ;u++) if(sortiert[i] > sortiert[u]) { save = sortiert[i]; sortiert[i] = sortiert[u]; sortiert[u] = save; } } /* kopiert das Array woerter in das Array woerterSort, wobei die Wörter im Array woerterSort jedoch nach ihren Buchstaben sortiert sind. */ void kopierSortierWoerter(void) { int v; int groesse = sizeof(woerter)/sizeof(char*); if((woerterSort = (char**)malloc(sizeof(char*)*groesse)==NULL) return EXIT_FAILURE; for(v=0; v<groesse; v++) { if((woerterSort[v]=(char*)malloc(strlen(woerter[v])*sizeof(char)))==NULL) return EXIT_FAILURE; sortierBuchstaben(woerterSort[v], woerter[v]); } } /* sucht im Array woerterSort nach Wort, das die gleichen Buchstaben wie das Wort nam enthält: - findet diese Funktion ein solches Wort, gibt sie den entspr. Index aus dem Array woerterSort zurück. - findet diese Funktion kein solches Wort, gibt sie Wert -1 zurück */ int sucheWort(char *nam) { int i, u, j; for(i=0; i<8; i++) { j=0; for(u=0; u<strlen(woerterSort[i]); u++) if(woerterSort[i][u]==nam[j]) { j++; if(j==strlen(nam)) return i; } } return -1; } int main(void) { char name[100], nameSort[100]; int l; printf("Name: "); gets(name); sortierBuchstaben(nameSort, name); kopierSortierWoerter(); if ( (l = sucheWort(nameSort)) >= 0) printf(" ---> %s\n", woerter[l]); else printf(" ---> kein Wort dazu gefunden\n"); return 0; }
Ursprünglich stand statt dem Wort "dudelsackspieler" das Wort "hansi". Mit hansi hat es auch prima geklappt. Dann habe ich mal dudelsackspieler reingeschieben und es ist abgestürzt. Ich hab es dann auch mit anderen Wörtern probiert und da hat es geklappt.(die Wörter waren von der Länge her mal kürzer und mal länger als dudelsackspieler, also hab ich mal ausgeschlossen, dass es zu lang ist) Warum funktioiert es bei diesem Wort nicht?
-
pfui
- globale Variablen
- gets
- return aus void-funktion
- ...malloc(strlen(woerter[v])*sizeof(char))
reserviert zu wenig Speicher
-
Wutz schrieb:
pfui
- globale VariablenNein!
-
Wutz schrieb:
pfui
- globale Variablen
- gets
- return aus void-funktion
- ...Alles bis auf die Funktionen sind von meinem Prof ^^ (war ne Klausuraufgabe)-> nur für das return kann ich was (ich möchte gerne das Programm bei einem Fehler beenden)
Wieso reserviert es zu wenig Speicherplatz?
Ich hab doch die Länge des Strings mal die Größe von char genommen. Das sollte doch genau die Größe des Wortes sein. Zudem stürzt das Programm nur bei dieser Wortlänge ab.
-
Woran erkennen z.B. strcpy und strlen wie lang das Wort ist?
-
DirkB schrieb:
Woran erkennen z.B. strcpy und strlen wie lang das Wort ist?
Hahaaa, er will es dir nicht zu einfach machen.. Aber ja, das ist der Grund.
Wutz schrieb:
pfui
[...]
- return aus void-funktionNein!
edit: Ach soo ein
return
. Ja, das macht man nicht! Du meintest wohl eherexit(EXIT_FAILURE);
Was mir außerdem noch aufgefallen ist:- keine
free()
s trotzmalloc()
s - brauch man im Prinzip in dem kleinen Programm nicht, aber um sich's anzugewöhnen sollte man es unbedingt immer machen gets()
ist ganz übel; wurde ja schon gesagt* sizeof(char)
kannst und solltest du dir sparen, das ist per Definition 1
- keine
-
philipp2100 schrieb:
edit: Ach soo ein
return
. Ja, das macht man nicht! Du meintest wohl eherexit(EXIT_FAILURE);
Ah, danke. Ja, das wäre besser.
philipp2100 schrieb:
Was mir außerdem noch aufgefallen ist:
- keine
free()
s trotzmalloc()
s - brauch man im Prinzip in dem kleinen Programm nicht, aber um sich's anzugewöhnen sollte man es unbedingt immer machen
Ja, ich mach das sonst auch immer, aber es ist eine Klausur Aufgabe, in der ich nur in die Funktionen schreiben durfte (und keine neuen erstellen durfte).
Und da es nicht unbedingt notwendig ist, hab ich es weggelassen.philipp2100 schrieb:
gets()
ist ganz übel; wurde ja schon gesagt* sizeof(char)
kannst und solltest du dir sparen, das ist per Definition 1
Zu gets(): Wie schon gesagt nicht mein Fehler, die main hat mein Prof geschrieben, ich hätte es auch anders gemacht.
Zu sizeof(char): Ja, stimmt eigentlich, hab daran gar nicht gedacht.DirkB schrieb:
Woran erkennen z.B. strcpy und strlen wie lang das Wort ist?
Okay, ich glaub ich habs verstanden:
Ich muss (strlen(woerter[v])+1) machen, da bei der Stringlänge das '\0' nicht beachtet wird.
Danke!
Ich fand nur komisch, dass bei längeren Wörtern er kein Problem hatte...
- keine