Seite 1 von 2

Vorkommen von Wort in String zählen

Verfasst: Fr Sep 03, 2010 11:07 am
von tauberheli
Hallo,

ich weiß gar nicht, was ich in die Betreffzeile schreiben soll, da ich vor einem Rätsel stehe.

Folgendes Programm soll in einem Text zählen, wie oft das Wort "verliert" vorkommt:

Code: Alles auswählen

#include <stdio.h>

main()
{
  FILE 	*fp;
  int i, Wort = 0;
  char	 line[150];

  
  fp = fopen("F:\\C\\test.txt", "r");
  
  while ( fgets(line, 150, fp) != NULL)       
    
    {       
        for (i = 14; i <= 150; i++)
        
                    
          {
           if (line[i] == 'v' && line[i+1] == 'e' && line[i+2] == 'r' &&  line[i+3] == 'l' &&
           line[i+4] == 'i' && line[i+5] == 'e' && line[i+6] == 'r' && line[i+7] == 't')
                     
           Wort = Wort + 1;
          } 
         
     } 
  
  printf("%d", Wort);   
       
  fclose(fp);
  
}
Edit by Xin: CodeTags eingefügt
Bei folgender Text-Datei wirft das Programm als Ergebnis 1 aus, was soweit richtig ist:

Doch im Semifinale von Roland Garros verliert Melzer schließlich.
Jürgen Melzers Siegeszug bei den French Open katapultiert den Österreicher auf Rang 16.
Er ist damit zweitbester Österreicher der Geschichte.

Bei dieser Text-Datei wirft das Programm allerdings als Ergebnis 3 aus, was völlig falsch ist:

Doch im Semifinale von Roland Garros verliert Melzer schließlich.
Platz 3: Federer passt auf.
Platz 4: Kirilenkowa wirft weg.

Kann mir jemand sagen, woran das liegt?

Danke,
Heli

Edit by dani93: Betreff geändert, war: "worin liegt der fehler?"

Re: worin liegt der fehler?

Verfasst: Fr Sep 03, 2010 12:22 pm
von Xin
Ja, kann ich, aber das wäre ja langweilig für Dich. ^^

Darum beantworte mir doch mal folgende Fragen, vielleicht kommst Du selbst drauf.
Warum startet Du bei Index 15? Warum endest Du bei Index 150?

PS: das Programm hat noch weitere Fehler, auf die ich Dich dann gleich aufmerksam mache, wenn es (anscheinend) funktioniert.

Re: worin liegt der fehler?

Verfasst: Fr Sep 03, 2010 1:46 pm
von tauberheli
Hi Xin,

den Index bei 15 zu beginnen ist natürlich ein Blödsinn. (Sollte bei 0 beginnen.)

Dass ich 150 Zeichen einlese hat damit zu tun, dass ich Texte verarbeiten möchte, die auch teilweise mehr als 100 Zeichen / Zeile aufweisen.
Habe daher 150 Zeichen als Maximum gewählt.

Saludos,
Heli

Re: worin liegt der fehler?

Verfasst: Fr Sep 03, 2010 3:06 pm
von Xin
tauberheli hat geschrieben:den Index bei 15 zu beginnen ist natürlich ein Blödsinn. (Sollte bei 0 beginnen.)
So sehe ich das auch.
tauberheli hat geschrieben:Dass ich 150 Zeichen einlese hat damit zu tun, dass ich Texte verarbeiten möchte, die auch teilweise mehr als 100 Zeichen / Zeile aufweisen.
Habe daher 150 Zeichen als Maximum gewählt.
Joah... die Fragen sind eher dafür gedacht, dass Du über Deine Antworten nachdenkst, ich lese Deine Antworten schon aus dem Quelltext.

Du hast also 150 als Maximum.... wie lang sind Deine Zeilen?

Re: worin liegt der fehler?

Verfasst: Fr Sep 03, 2010 5:47 pm
von tauberheli
Nur zur Info: Ich bin völlig autodidakt unterwegs.

Es treten Zeilen bis zu einer Länge von 110 Zeichen auf. Ich habe das Maximum auf 150 Zeilen gesetzt. Aber darin liegt doch nicht der Fehler des Programms, oder?

Es ist mir natürlich klar, dass sich sicher eine elegantere Lösung finden lässt, um den gewünschten Effekt zu erzielen. (Nämlich bestimmte Wörter in einer Text-Datei zu finden.) Aber mich würde vorerst mal sehr stark interessieren, worin der Fehler in meinem (bescheidenen) Programm liegt.

Gruß,

Re: worin liegt der fehler?

Verfasst: Fr Sep 03, 2010 6:00 pm
von Xin
tauberheli hat geschrieben:Nur zur Info: Ich bin völlig autodidakt unterwegs.
Das hindert Dich ja nicht, etwas Neues durch denken zu lernen :-)
tauberheli hat geschrieben:Es treten Zeilen bis zu einer Länge von 110 Zeichen auf. Ich habe das Maximum auf 150 Zeilen gesetzt. Aber darin liegt doch nicht der Fehler des Programms, oder?
Nein, das funktioniert soweit.

Wenn Du ein Wort findest, dann gib Dir doch mal die Position aus, an der Du das Wort findest und vielleicht die Textzeile:
printf( "%s - %d\n", line, i );
tauberheli hat geschrieben:Es ist mir natürlich klar, dass sich sicher eine elegantere Lösung finden lässt, um den gewünschten Effekt zu erzielen. (Nämlich bestimmte Wörter in einer Text-Datei zu finden.) Aber mich würde vorerst mal sehr stark interessieren, worin der Fehler in meinem (bescheidenen) Programm liegt.
Es gibt sicherlich elegantere Lösungen, aber darum geht es mir hier auch nicht. Ich will Dich die Fehler finden lassen, das bedeutet, dass ich Dir Hinweise geben kann und Du kannst überlegen, verstehen und korrigieren.
Ich kann Dir natürlich auch die Probleme auf's Auge binden, Du korrigierst sie und vergisst das Problem wieder. ^^

Re: worin liegt der fehler?

Verfasst: Sa Sep 04, 2010 9:40 am
von tauberheli
Habe

printf( "%s - %d\n", line, i );

eingegeben. Das Ergebnis ist sehr "seltsam". :o

Wenn die darunterliegende Zeile vor Position 40 (= Pos. von "verliert" in der darüberliegenden Zeile) endet, wird sie ebenfalls ausgegeben.

Der Kopf raucht zwar schon, aber das Problem in meinem Quelltext ist mir immer noch nicht bewusst.

LG


Wo kommen übrigens die Sonderzeichen in der 1. Zeile her?

Re: worin liegt der fehler?

Verfasst: Sa Sep 04, 2010 9:46 am
von cloidnerux
Habe

printf( "%s - %d\n", line, i );

eingegeben. Das Ergebnis ist sehr "seltsam". :o

Wenn die darunterliegende Zeile vor Position 40 (= Pos. von "verliert" in der darüberliegenden Zeile) endet, wird sie ebenfalls ausgegeben.
Dann überleg doch mal, wie der Text von der Datei bis zum if kommt.

Re: worin liegt der fehler?

Verfasst: Sa Sep 04, 2010 12:14 pm
von tauberheli
Danke! Jetzt ist alles klar. Zumindest was fgets() betrifft.

Ich muss den String leeren, bevor ich wieder mit fegts() einlese.

LG

Re: worin liegt der fehler?

Verfasst: Sa Sep 04, 2010 12:20 pm
von nufan
tauberheli hat geschrieben:Ich muss den String leeren, bevor ich wieder mit fegts() einlese.
Nein, du musst den String nicht leeren. Der alte String wird überschrieben und das Ende des neuen Strings wird durch ein von fgets() eingefügtes \0 markiert. Was dahinter liegt ist uninteressant.