Hallo
kennt jemand von euch einen Link für ein c programm das die worthäufigkeit aus einem Text bestimmt.
Danke
Hallo
kennt jemand von euch einen Link für ein c programm das die worthäufigkeit aus einem Text bestimmt.
Danke
Hausaufgaben?
Zu wenig details. Was soll als Wort betrachtet werden? Was als Trennzeichen? Soll Groß-/Kleinschreibung beachtet werden?
Und wieso hört sich das ziemlich stark nach Hausaufgabe bzw. Übungsblatt an?
Das ganze lässt sich mit 'ner STL-Map und einem simplen Tokenizer recht einfach schreiben.
hallo zusammen,
muss für die uni ein c programm schreiben, welches eine Datei einliest und die Häufigkeit der einzelnen Wörter bestimmt die in dem Text vorkommen. Groß und Kleinschreibung muss nicht beachtet werden
(kann alles in Großbuchstaben oder Kleinbuchstaben umgewandelt werden).
Das ganze soll alphabetisch ausgegeben werden.
Programmiere schon ne ganze Weile daran rum.
Möchte mit fscanf die Datei einlesen…weiss jemand wenn ich mit %s einlese ob dann hinter jedes eingelesene wort die \0 angehängt wird?
Wie lese ich am besten ein…fscanf,fgets?
Dann char *zeiger[] auf die einzelnen Wörter.
Um die Häufigkeit zu bestimmen hab ich mir gedacht vielleicht mit strcmp zu arbeiten?
Kann mir hierbei jemand helfen? Verschachtelte Schleife?
und dann zwei Zeigerwerte vergleichen —> Bei übereinstimmung
soll der eine zeiger die Anzahl erhöhen.
Tu mich da noch ein bisschen schwer…
und sortieren mit quicksort…läuft soweit.
Am Schluss soll das Programm diese Ausgabe haben:
Beate ( 3 mal)
Tarzan (4 mal)
Zigeuner (1 mal)
Wäre nett von euch wenn mir jemand weiter helfen kann.
Vielleicht weiss ja auch jemand einen link zu diesem Thema.
Vielen Dank
mshadow
[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]
Möchte mit fscanf die Datei einlesen…weiss jemand wenn ich
mit %s einlese ob dann hinter jedes eingelesene wort die \0
angehängt wird?
Ja, fscanf sollte null-terminieren. Aber vorsicht, es findet keine Überprüfung auf Array-Grenzen statt. Wenn du also einen Puffer mit z.B. 1024 Zeichen kapazität einrichtet und ein Wort ist 1025 zeichen lang, dann werden schon die ersten zwei Byte des nächsten Wertes auf dem Heap überschrieben.
Ich würde vorschlagen, mit fgets in einen temporären Puffer zu lesen (fgets nimmt als zweiten Charakter ein Maximum an). Achte darauf, den Puffer ein Zeichen länger auszulegen unf ggf. manuell zu terminieren, wenn fgets genau die übergebene Anzahl an Zeichen einliest. Auf dem Puffer kannst du dann recht sicher mit sscanf arbeiten, oder sogar zeichenorientiert selber rumfummeln:
#include
char\* start = buffer;
char\* end = start;
while( end
(Das ist nur grob hingesaut, aber als Grundlage sollte es taugen.)
> Wie lese ich am besten ein...fscanf,fgets?
Die witzigste Methode, die mir grade einfällt wäre, die Eingabe zu mmap()en und dann einfach als langes char\* zu behandeln. Das ist Betriebssystemabhängig, aber du sparst dir das fscanf/fgets-Gerangel und die Pufferung. Ansonsten siehe oben.
> Dann char \*zeiger[] auf die einzelnen Wörter.
Ja, aber vergiss nicht, die am Ende auch schön wieder aufzuräumen.
> Um die Häufigkeit zu bestimmen hab ich mir gedacht vielleicht
> mit strcmp zu arbeiten?
> Kann mir hierbei jemand helfen? Verschachtelte Schleife?
> und dann zwei Zeigerwerte vergleichen ---\> Bei übereinstimmung
> soll der eine zeiger die Anzahl erhöhen. Tu mich da noch ein
> bisschen schwer..:frowning:
Du sagst weiter unten, dass du schon ein funktionierendes Quicksort hast. Wenn du zuerst sortierst, kannst du das in einem Durchgang machen. Dafür reichen dann theoretisch zum Vergleich ein Vergleich von strlen und nur im Bedarfsfall (Längen gleich) strcmp.
Danke für deine Hilfe…
Probiere es mal mit fgets und tokens.
#include
#include
#include
#define N 200
int main(void)
{
FILE *datei;
FILE *dateiaus;
char wort[2000];
char *z[N];
int i=0,c=0,n,j=0;
datei = fopen(„text.txt“,„r“);
dateiaus = fopen(„berni.txt“,„w“);
if(datei==NULL)
{
printf(„Datei konnte nicht geöffnet werden!\n“);
exit(1);
}
while(fscanf(datei, „%s“, wort) != EOF)
{
printf("%s\t\t\t%d mal\n",wort,i);
fprintf(dateiaus,"%s : %d mal\n",wort,i);
strcpy(z[j],wort);
j++;
}
fclose(datei);
return 0;
}
Hab es nochmal mit fscanf probiert. Warum geht das nicht das ich jedes eingelesene wort einem zeigerfeld z[j]zuordne?
Hängt fscanf keine /0 an jeden einzelnen String ( nur am Ende?)
Kannst du mir vielleicht jemand helfen.
Hab vor einer Woche erst mit c angefangen.
Weiss vielleicht einer ne seite wo Strings mit Token beschrieben wird.
Vielen Dank
mshadow