Vorkommen von Wort in String zählen

Schnelle objektorientierte, kompilierende Programmiersprache.
tauberheli
Beiträge: 16
Registriert: Di Apr 27, 2010 3:47 pm

Vorkommen von Wort in String zählen

Beitrag von tauberheli » Fr Sep 03, 2010 11:07 am

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?"

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: worin liegt der fehler?

Beitrag von Xin » Fr Sep 03, 2010 12:22 pm

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.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

tauberheli
Beiträge: 16
Registriert: Di Apr 27, 2010 3:47 pm

Re: worin liegt der fehler?

Beitrag von tauberheli » Fr Sep 03, 2010 1:46 pm

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

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: worin liegt der fehler?

Beitrag von Xin » Fr Sep 03, 2010 3:06 pm

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?
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

tauberheli
Beiträge: 16
Registriert: Di Apr 27, 2010 3:47 pm

Re: worin liegt der fehler?

Beitrag von tauberheli » Fr Sep 03, 2010 5:47 pm

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ß,

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: worin liegt der fehler?

Beitrag von Xin » Fr Sep 03, 2010 6:00 pm

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. ^^
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

tauberheli
Beiträge: 16
Registriert: Di Apr 27, 2010 3:47 pm

Re: worin liegt der fehler?

Beitrag von tauberheli » Sa Sep 04, 2010 9:40 am

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?

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3125
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: worin liegt der fehler?

Beitrag von cloidnerux » Sa Sep 04, 2010 9:46 am

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.
Redundanz macht wiederholen unnötig.
quod erat expectandum

tauberheli
Beiträge: 16
Registriert: Di Apr 27, 2010 3:47 pm

Re: worin liegt der fehler?

Beitrag von tauberheli » Sa Sep 04, 2010 12:14 pm

Danke! Jetzt ist alles klar. Zumindest was fgets() betrifft.

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

LG

nufan
Wiki-Moderator
Beiträge: 2558
Registriert: Sa Jul 05, 2008 3:21 pm

Re: worin liegt der fehler?

Beitrag von nufan » Sa Sep 04, 2010 12:20 pm

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.

Antworten