Präprozessor in eine Variable umbauen, Programm tuts nicht mehr
-
Hallo Community,
das Programm hier soll nichts anderes tun, als die erste Eingabe für
die max. Wortlänge und die zweite für den zu bearbeitenden Text hernehmen.
Wenn ein Wort länger, als die bestimmte max Wortlänge ist, soll
er diese Zahl ganz hinten angeben. Für jedes Wort zählt es dann halt die
einzelnen Buchstaben und soll je nach Wortlänge diese der Buchstabenanzahl
zuordnen.#include <math.h> #include <string.h> #include <stdio.h> #include <stdlib.h> int iMAXW = 0; void wlist(char *s, int *l) { char *t; for (t = strtok(s, " ?!.,\n"); t; t = strtok(0, " .,\n")) if (*t && strlen(t) <= iMAXW) l[strlen(t) - 1]++; } main() { char strtmp[10]; char x[256]; int i, weiter = 1, lauf = 0, l[iMAXW]; printf("\nWas soll die Maximale Wortlaenge sein?\n"); scanf("%i\0\n", &l); getchar(); fflush(stdin); printf("Schreiben Sie ihren Text: \n"); fgets(x,sizeof x,stdin); //Eingabe des zu bearbeitenden Textes wlist(x, l); printf("\nHistogramm der Wortlaenge eines Textes\n" "----------------------------------------------------------------------------\n"); for (i = 0; i < iMAXW; ++i) printf("%3d", i + 1); puts(""); while (weiter) { ++lauf; weiter = 0; for (i = 0; i < iMAXW; ++i) printf(" %c", l[i] && l[i] >= lauf ? '*' : ' '), weiter = !weiter ? l[i] > lauf : weiter; puts(""); } printf("\n----------------------------------------------------------------------------\n"); for (i = 0; i < iMAXW; ++i) printf("%3s", l[i] > 7 ? (sprintf(strtmp,"%d",l[i]),strtmp) : ""); printf("\n"); return 0; }
in meinem Histogrammprogramm, wollte ich einbauen,
das man die Länge der maximalen Wortlänge selbst eingeben kann.
Nur als ich den Präprozessor "MAXW" (#define MAXW 25) umstellte in
"int iMAXW;", und alle MAXW in den int eintauschte, übernahm er die
Texteingaben nichtmehr, bzw. er bearbeitet sie nicht mehr und ich verstehe
einfach nicht wieso...
bei mir sieht es nach dem Programmstart immer nur so aus:Was soll die maximale Wortlaenge sein?
13
Schreiben Sie Ihren Text:
Anton hüpft auf der Wiese.Histogramm der Wortlaenge eines Textes
------------------------------------------------------------------------------------------------------------------------------------------------------
und mehr kommt da nicht. Normal sollte unter den ersten Strichen die einzelnen Zahlen für die Länge stehen und unter jeder Zahl dann Sternchen sein, für die Anzahl der Wörter der jeweiligen länge. Unter der zweiten Linie wird dann die Anzahl der Wörter in Zahlen hingeschrieben und ganz hinten sollte dann eigentlich eine neue Zahl stehen die dann anzeigt wiviele Wörter größer sind als die Variable iMAXW... bitte um Hilfe
-
Hab's mir nicht im Einzelnen angesehen, aber es ist doch schon mal seltsam, dass iMAXW beim Programmstart 0 ist und du folglich ein int-Array der Größe 0 anlegst (l). Wieso ist l überhaupt ein Array? Soll da nicht die vom User gewünschte maximale Wortlänge drin stehen? Dann sollte das eher ein einfaches int sein.
Btw, die main-Funktion ist so nicht standardkonform und sollte den Rückgabewert int verpasst bekommen.
EDIT: fflush(stdin) ist laut Standard undefiniert. Beim MS-Compiler ist das erlaubt, aber den benutzt du offensichtlich nicht (sonst könntest du keine C99-Features nutzen). Es gibt andere Möglichkeiten, den Eingabepuffer zu leeren (=>SuFu nutzen).
-
Die maximale Wortlaenge steht ja in iMAXW drinnen.
Übrigens, was ist SuFu? Habe ich nochnie davon gehört, ich kenne leider nur fflush.
-
Phenny schrieb:
Übrigens, was ist SuFu? Habe ich nochnie davon gehört, ich kenne leider nur fflush.
Suchfunktion.
-
Phenny schrieb:
Die maximale Wortlaenge steht ja in iMAXW drinnen.
Übrigens, was ist SuFu? Habe ich nochnie davon gehört, ich kenne leider nur fflush.
Damit meinte ich die SUchFUnktion des Forums.
Tatsache ist jedenfalls, dass du da ein leeres int-Array erzeugst und dann in dieses reinschreiben willst. Das kann ja so nicht richtig sein.
-
Naja, ich habe es einfach auf 0 gesettet, damit da nicht Datenmüll drinnensteht.
Dachte, dass macht man so.
-
Phenny schrieb:
Naja, ich habe es einfach auf 0 gesettet, damit da nicht Datenmüll drinnensteht.
Dachte, dass macht man so.Den Inhalt zu nullen ist was anderes, als 0 Elemente zu haben. Hiermit
int i=0; //... int arr[i];
erzeugst du ein Array mit 0 Elementen...
Ein Array mit 0 zu initialisieren, geht z.B. so:
int arr[10]={0};
-
Ich habe jetzt mal
int iMAXW;
gelassen, es also nicht genullt...
dennoch bleiben meine eigentlichen Probleme (siehe Beitrag 1)
-
Übrigens, ich bekomme jetzt nach der Texteingabe eine Endlosschleife,
in der er mir lauter Sternchen macht...
Ich wollte die fflush Alternative benutzen:scanf ( "%*[^\n]" ); scanf ( "%*c" );
-
Phenny schrieb:
Ich habe jetzt mal
int iMAXW;
gelassen, es also nicht genullt...
dennoch bleiben meine eigentlichen Probleme (siehe Beitrag 1)
Du hast das Problem ja auch in keinster Weise gelöst. Hast du die Antworten nicht gelesen? Inwiefern sollte es dir denn helfen, eine Arraylänge von 0 gegen eine undefinierte Arraylänge zu tauschen? Und das Nullen des Arrays hat wie dir schon erklärt wurde, überhaupt nichts mit deinem iMAXW zu tun.
c.rackwitz schrieb:
Wenn du selber Code schreibst, musst du ihn auch verstehen. Code ist kein Haufen von wahllos zusammengeschmissenen Buchstaben und Zeichen, Code ist Logik pur. Du musst genau wissen, warum du wo und welches Zeichen setzt.
-
iMAXW ist doch kein Array?, es ist doch nur l ein Array, welches den integer iMAXW enthält.
-
Phenny schrieb:
iMAXW ist doch kein Array?, es ist doch nur l ein Array, welches den integer iMAXW enthält.
Nein. So wie du es schreibst ist iMAXW ein int. l ist ein Array. Aber l enthält nicht iMAXW, sondern hat die Länge iMAXW. Und welchen Wert hatte iMAXW bei deinem Code?
Zuerst hatte es den Wert 0
Array hat Länge 0.
Fehler/Absturz beim Zugriff auf Arrayelemente
Dann, nach der Änderung, einen undefinierten Wert
Array hat undefinierte (möglicherweise sogar negative) Länge
in der Regel Absturz.
-
Also, SeppJ
bevor ich den Präprozessor MAXW in int iMAXW umgebaut habe, hatte ich
für den Array "l" eigentlichint l[MAXW] = {0};
nur geht das mit diesem int iMAXW nichtmehr weil ich dann
Probleme mit Pointer etc bekomme.
-
ups, mein Fehler...
ich meinte eig., dass ich dann Probleme mit der größe bekomme
siehe hierhistogramm.c:27: error: variable-sized object may not be initialized histogramm.c:27: warning: excess elements in array initializer histogramm.c:27: warning: (near initialization for ‘l’)
-
edit: war nicht richtig.
-
verstehe ich jetzt nicht...
-
also, so sah der Code am Anfang aus, bevor ich "iMAXW" eingeführt habe:
#include <math.h> #include <string.h> #include <stdio.h> #include <stdlib.h> #define MAXW 25 void wlist(char *s, int *l) { char *t; for (t = strtok(s, " ?!.,\n"); t; t = strtok(0, " .,\n")) if (*t && strlen(t) <= MAXW) l[strlen(t) - 1]++; } main() { char strtmp[10]; char x[256]; int i, weiter = 1, lauf = 0, l[MAXW] = {0}; printf("\nWas soll die Maximale Wortlaenge sein?"); scanf("\n%d", &MAXW); printf("Schreiben Sie ihren Text: \n"); fgets(x,sizeof x,stdin); //Eingabe des zu bearbeitenden Textes wlist(x, l); printf("\nHistogramm der Wortlaenge eines Textes\n" "----------------------------------------------------------------------------\n"); for (i = 0; i < MAXW; ++i) printf("%3d", i + 1); puts(""); while (weiter) { ++lauf; weiter = 0; for (i = 0; i < MAXW; ++i) printf(" %c", l[i] && l[i] >= lauf ? '*' : ' '), weiter = !weiter ? l[i] > lauf : weiter; puts(""); } printf("\n----------------------------------------------------------------------------\n"); for (i = 0; i < MAXW; ++i) printf("%3s", l[i] > 7 ? (sprintf(strtmp,"%d",l[i]),strtmp) : ""); printf("\n"); return 0; }
-
printf("\nWas soll die Maximale Wortlaenge sein?"); scanf("\n%d", &MAXW);
sorry, hatte vergessen das noch aus dem alten Code rauszulöschen...
#include <math.h> #include <string.h> #include <stdio.h> #include <stdlib.h> #define MAXW 25 void wlist(char *s, int *l) { char *t; for (t = strtok(s, " ?!.,\n"); t; t = strtok(0, " .,\n")) if (*t && strlen(t) <= MAXW) l[strlen(t) - 1]++; } main() { char strtmp[10]; char x[256]; int i, weiter = 1, lauf = 0, l[MAXW] = {0}; printf("Schreiben Sie ihren Text: \n"); fgets(x,sizeof x,stdin); //Eingabe des zu bearbeitenden Textes wlist(x, l); printf("\nHistogramm der Wortlaenge eines Textes\n" "----------------------------------------------------------------------------\n"); for (i = 0; i < MAXW; ++i) printf("%3d", i + 1); puts(""); while (weiter) { ++lauf; weiter = 0; for (i = 0; i < MAXW; ++i) printf(" %c", l[i] && l[i] >= lauf ? '*' : ' '), weiter = !weiter ? l[i] > lauf : weiter; puts(""); } printf("\n----------------------------------------------------------------------------\n"); for (i = 0; i < MAXW; ++i) printf("%3s", l[i] > 7 ? (sprintf(strtmp,"%d",l[i]),strtmp) : ""); printf("\n"); return 0; }
-
Üblicherweise verwendet man Grossbuchstaben für Konstanten oder #define wie im Beispiel. Wenn diese auch noch variabel sein soll, wie du jetzt offenbarst, dann muss für C89, wo Arraydefinition nur für konstante Größen definiert ist, auch l dynamisch definiert werden, z.B. mittels
int *l=calloc(imaxw,sizeof(int)); /* sollte vor Ende auch wieder freigegeben werden */
-
Wutz schrieb:
Üblicherweise verwendet man Grossbuchstaben für Konstanten oder #define wie im Beispiel. Wenn diese auch noch variabel sein soll, wie du jetzt offenbarst, dann muss für C89, wo Arraydefinition nur für konstante Größen definiert ist, auch l dynamisch definiert werden, z.B. mittels
int *l=calloc(imaxw,sizeof(int)); /* sollte vor Ende auch wieder freigegeben werden */
Verwirr ihn doch nicht entgültig.
Da er sein gepostetes Programm offensichtlich bis zur Ausführung gebracht hat, dürfen wir, denke ich, davon ausgehen, dass er einen C99-Compiler einsetzt.