Bitte um Hilfe!!!
-
@Wade1234 sagte in Bitte um Hilfe!!!:
das aufräumen im fehlerfall kann man auch weglassen, wenn man das programm sowieso beendet (ganz böse
), oder man erstellt sich halt eine funktion, die das macht, und schon hat niemand mehr was zu meckern.
das kann man auch weglassen, wenn man auf malloc/realloc verzichtet, also einen statischen buffer verwendet. wer einzelne wörter einliest, darf getrost eine maximallänge voraussetzen.
-
@RBS2 sagte in Bitte um Hilfe!!!:
das kann man auch weglassen, wenn man auf malloc/realloc verzichtet, also einen statischen buffer verwendet.
@Wade1234 spielt wohl eher darauf an, daß das OS sowieso klar Schiff macht.
@RBS2 sagte in Bitte um Hilfe!!!:
wer einzelne wörter einliest, darf getrost eine maximallänge voraussetzen.
Das sind die berühmten letzten Worte vor einem Buffer-overflow. Vor allem weiß ich ja im vorliegenden Fall ganz genau, wieviel ich maximal lesen will. Wörter länger als
needle
interessieren sowieso nicht.
-
@Swordfish sagte in Bitte um Hilfe!!!:
Das sind die berühmten letzten Worte vor einem Buffer-overflow.
Nimmste fgets(). Da flowed nix over.
-
@RBS2 Mhm. Und dabei zerstückelst mit gut glück das gesuchte wort. Komm. Troll dich.
-
@Swordfish sagte in Bitte um Hilfe!!!:
Und dabei zerstückelst mit gut glück das gesuchte wort.
wenn das letzte zeichen des buffers kein whitespace ist, kopierst du die zeichen zwischen dem letzten whitespace und buffer-ende nach vorn (memcpy) und füllst den rest des buffers mit dem nächsten fgets()-call auf. dann kannste wieder strtok machen.
das mag für dich vielleicht zu kompliziert sein, ist aber recht einfach. besser jedenfalls, als irgendwelche malloc-realloc-free-orgien.
buffer-größe? nimm 1024. so lange wörter schreibt kein mensch.
-
oder die fscanf-variante, kurz und knackig:
void read_words (FILE *f) { char x[1024]; while (fscanf(f, " %1023s", x) == 1) { puts(x); } }
gesehen auf stackoverflow.com.
hat hoffentlich keinen overflow.
-
@RBS2 sagte in Bitte um Hilfe!!!:
das mag für dich vielleicht zu kompliziert sein, ist aber recht einfach. besser jedenfalls, als irgendwelche malloc-realloc-free-orgien.
Du findest also
strtok()
- und Herumkopierorgien besser als von Anfang an das zu lesen, was man braucht. Ja ne, klingt logisch ^^@RBS2 sagte in Bitte um Hilfe!!!:
oder die fscanf-variante
... ist genau was ich mache. Nur eben mit passender Puffergröße.
-
@Wade1234 ok vielen dank ich melde mich für weitere Probleme falls ich auf welche zustöße
-
@Swordfish sagte in Bitte um Hilfe!!!:
... ist genau was ich mache.
Bloß brauchst du fast 100 Zeilen dafür.
-
@RBS2 Mein Physikprof hat immer gesagt: "Schreibarbeit ist keine Arbeit.". Für
format
ginge auch eine feste Größe ... dann sinds schon mal ~20 Zeilen weniger.Zeig doch deine tolle Variante ...
-
@Swordfish sagte in Bitte um Hilfe!!!:
Zeig doch deine tolle Variante ...
Hier, knapp 30 Zeilen:
#include <stdio.h> #include <stdlib.h> #include <memory.h> #define STOP(x) {puts(x);exit(-1);} int main(int argc, char* argv[]) { if (argc != 3) STOP ("1st arg: file name, 2nd arg: needle"); FILE *fp = fopen (argv[1], "r"); if (fp == 0) STOP ("Can't open ..."); int n=0, found=0; char word[1024]; while (fscanf(fp, " %1023s", word) == 1) { n++; if (!strcmp (word, argv[2])) { found++; printf ("\'%s\' is at pos. %d\n", argv[2], n); } } printf ("Found \'%s\' %d times.\n", argv[2], found); }
Spuckt aus:
'Sachverwalter' is at pos. 1
'Sachverwalter' is at pos. 9
'Sachverwalter' is at pos. 10
Found 'Sachverwalter' 3 times.beim Input:
Sachverwalter
hallo das is ein text mustermann
muster
Sachverwalter Sachverwalter
pluster
-
@RBS2 Ein Makro, really??
@RBS2 sagte in Bitte um Hilfe!!!:
exit(-1);
Mhm.
EXIT_FAILURE
ftw.Was soll das
n
? Das hat doch keine relation zu der Position in der Datei.
-
@Swordfish sagte in Bitte um Hilfe!!!:
@RBS2 Ein Makro, really??
@RBS2 sagte in Bitte um Hilfe!!!:
exit(-1);
Mhm.
EXIT_FAILURE
ftw.Was soll das
n
? Das hat doch keine relation zu der Position in der Datei.n ist die Wortnummer.
Was hast du gegen Makros?