hugo zählen

M

Mono

Grünschnabel
Tag! Hab vorhin gesehen das jemand ein ähnliches Problem gepostet hat, aber wie funktioniert das jetzt in C genau, wenn ich aus einer Datei report.txt die Vorkommen eines best. Strings (zB. hugo) zählen muss?
thx
 
hi!

also ich wuerde das so loesen:
Code:
int count(const char *str, const char *search){/*ich gehe mal davon aus dass die uebergabe parameter nicht veraendert werden duerfen*/
  int c = 0; /*in dieser variable steht spaeter wie oft das wort gefunden wurde*/
  char *pos;/*das ist unser str im endeffekt nur dass es eben nachhaerveraendert wird*/

  pos = malloc(strlen(str));/*lege den speicher fuer unser pos an*/
  memcpy(pos, str, strlen(str));/*kopiere str in pos*/
  
  while(pos){
    pos = strstr(pos, search);/*suche search in pos*/

    if(pos == NULL){/*wurde keins gefunden?... schleife abbrechen*/
      return c;/*c zurueckgeben*/
    }

    pos += (strlen(search) + 1);/*zaehle den speicher hinauf damit weitergesucht wird und nicht das selbe hugo nochmal vorkommt*/
    c++;/*anzahl der gefundenen plus 1*/
  }
}
die methode gibt zurueck wie oft sie den ausdruck search gefunden hat

und ein beispielprogramm zu dieser funktion waere folgendes:
Code:
int main(void){
  int s = count("hallo hugo das ist aber ein schoener tag oder hugo? ja sagt darauf der hugo", "hugo");
  printf("%d\n", s);/*gibt in unserem fall 3 aus*/
}

tja ich hoffe ich konnte dir helfen

mfg hazelnoot
 
Danke, das sieht echt ganz gut aus!
Meine letztes Problem ist dann, dass er hugo in der Datei report.txt zählen soll
Code:
FILE *report;
 report=fopen("report.txt","r");
Wie muss ich das angeben?
Statt
int s = count("hallo hugo das ist aber ein schoener tag oder hugo? ja sagt darauf der hugo", "hugo");
??
 
Code:
pos = malloc(strlen(str));/*lege den speicher fuer unser pos an*/

So produzierst Du ein schönen Speicherleck - warum überhaupt was allozieren, wir suchen doch nur im Suchstring, besser:

Code:
int count(const char *str, const char *search){
  int count = 0;
  int len = strlen(search);
  char *pos;

  while((pos = strstr(str, search)) != NULL) {
    count++;
    pos += len;
  }

  return count;
}

PS: ... und das Einlesen: Am einfachsten wäre die Annahme, das die Datei zeilenweise zu lesen ist, und dass das Suchwort nicht über ein Zeilenende hinausgeht (also kein \n enthält). Dann würde wohl folgendes funktionieren:

Code:
FILE *report=fopen("report.txt","r");
int rowsize = 4096;
char *row = malloc(rowsize);
int total = 0;

if (row != NULL) {
    if (report != NULL) {
        while (fgets(row, rowsize, report) != NULL) {
            total += count(row, "suchstring");
        }
    }
    free(row);
}
if (report != NULL)
    fclose(report);

Bei fgets gab es glaube ich das Problem, wenn die Zeilenlänge in der Datei größer als der übergebene Buffer ist, wird keine \0 drangehängt - also stell sicher, das keine Zeile länger ist :-)
Wenn die Datei nicht SOOO groß ist, kannst Du sie natürlich auch vorher komplett mit fread() einlesen ...

Heiko
 
Zuletzt bearbeitet:

Ähnliche Themen

Switche abfragen über Script

batch script funktioniert nicht ...brauche hilfe

Dateien selektieren und zählen

String auf Konsole ausgeben

Bräuchte Hilfe bei Backupscript mittels Bash und cronjob

Zurück
Oben