Wörter auslesen
-
Hallo,
in eine Text-Datei steht z.B drinnen:
void main() { int i; for ( i = 0 ; i< 5 ; i++) { printf("%d\n"); } }
und ich will die printfs suchen und dann zählen wie viel sich in dieser Text-Datei befinden.
Das ganze dient als Übung zum C-Programmieren. Bitte keine vorgefertigten Biblos verwenden: string.h(strcmp etc.) usw. dürfen wir nicht.
nur stdio.h, stdlib.h, time.h für srand und so.Also wie soll ich das anstellen vielleicht mal das ganze in ne while packen und ein character-array oder nen character auslesen:
while(!feof(text)) { fscanf(text,"%s\n",tmp); if(tmp[0]=='p'&& tmp[1]=='r' usw. bis halt zum 'f') { anzahl++; } }
Könnte man das so machen?
Tipps geben bitte.MfG Bean
-
string.h vorgefertigte Bibliothek? Das gehört zum Sprachstandard!
Vorgehen wurde ich mit einem kleinen Trick, um dem Lehrer eines auszuwischen: Du überlegst dir, wie du das implementieren wurdest mit den Funktionen aus der string.h. Am besten probierst du es auch gleich konkret aus, ob alles funktioniert. Dann benennst du dir ganzen Funktionsaufrufe an die string.h um, z.B. strlen(foo) nach my_strlen(foo). Und dann implementierst du diese my_xxxx Funktionen selber. Die meisten Funktionen aus de string.h sind äußerst trivial, meistens nur eine einzelne Schleife auf die man leicht kommt.
Der Vorteil der Methode ist: Das was du lernen sollst (den Umgang mit C-Strings), lernst du trotzdem, wenn du die Funktionen implementierst. Gleichzeitig bekommst du auch ein Gefühl für die string.h-Funktionen, die später noch sehr wichtig sein werden. Und wenn du zuerst dein Programm so schreibst, dass es die string.h Funktionen benutzt, dann besteht auch keine Gefahr, dass du anfängst komische Sachen wie Parameterübergabe per globalen Variablen zu machen. Viele Anfänger neigen nämlich zu solchen Notlösungen, weil sie Arrays als Funktionsargumente nicht kapieren. So wird sichergestellt, dass du das auch wirklich lernst.
-
Bean schrieb:
if(tmp[0]=='p'&& tmp[1]=='r' usw. bis halt zum 'f')
als ansatz schon nicht schlecht, aber lieber mit tmp[i] usw. statt mit festen indizes.
-
x.x. schrieb:
als ansatz schon nicht schlecht, aber lieber mit tmp[i] usw. statt mit festen indizes.
noch besser wäre es wenn du dir eine eigene strstr funktion schreibst, die beliebige strings in einem string finden kann ( siehe tipp von seppj ).
-
// Sucht b in a. char* my_strstr( char* a, char *b) { ... }
-
ich hab mir mal ne eigene strstr funktion in c geschrieben, ist ne weile her muss ich mal suchen ... dann kann ich die mal posten
-
compare(s1, s2) { while (*s1 == *s2++) { if (*s1++ == 0) return (0); } return (-1); } So etwas kannst so nehmen...
-
mystr schrieb:
ich hab mir mal ne eigene strstr funktion in c geschrieben, ist ne weile her muss ich mal suchen ... dann kann ich die mal posten
suchst du immer noch?
ich hab mich auch mal daran versucht:
// Sucht b in a. // Bei erfolgreicher Suche wird der Zeiger auf das erste Vorkommen von b in a zurückgegeben, sonst NULL. char* my_strstr(char* a, char *b) { if(*a==0||*b==0) return NULL; // Pathologische Fälle ausschließen. while(*a) { if(*a==*b) { char* c=a, *d=b; while(*a&&*b) { if(*a!=*b) return NULL; a++, b++; } if(*b==0) return c; // Das erste Vorkommen von b in a wurde gefunden. b=d, a=c+1; } a++; } return NULL; // b ist nicht in a vorhanden. } int main() { char* a = "123annalytiker", *b = "anna", *d = my_strstr(a, b); if(d==NULL) { printf("%s not found in %s\n", b, a); return 0; } puts(a); while(a<d) putchar(' '), a++; putchar('^'), puts(""); return 0; }
-
[Klugscheiß]
Klar, es ist deine strstr-Funktion.
Für den Standard ist der Fall, wenn b leer ist, falsch behandelt.
Dann ist b auf alle Fälle in a enthalten.if(*b==0) return a;
[\Klugscheiß]
-
du meinst
if(*b==0) return 0;
? :p
stimmt, die nullbytes habe ich von der suche ausgeschlossen, denn ein nullbyte
soll ja nur das ende des strings markieren und nicht ein teil des strings sein.
soso, dem standard nach ist es falsch, nagut, wo kann man den runterladen?
-
achne, das war käse, es soll ja ein zeiger zurückgegeben werden, also so in der art:
return a+strlen(a);
-
B.B. schrieb:
du meinst
if(*b==0) return 0;
? :p
Nein ich meine
if(*b==0) return a;
Du gibts den Zeiger zurück, nicht den Offset.
Der Leerstring ist schon am Anfang enthalten.
-
wenn b leer ist und a nicht, dann gebe ich a zurück?
-
char *my_strstr(const char *s1, const char *s2) { const char *t = s2, *p = 0; if (!*s2) return (char*)s1; while (*s1) { if (*s1 == *t) { if (!p) p = s1; if (!*(++t)) return (char*)p; } else { t = s2; p = 0; } ++s1; } return 0; }
B.B. schrieb:
soso, dem standard nach ist es falsch, nagut, wo kann man den runterladen?
Gar nicht. Ein Draft gibt's hier:
http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1124.pdf
-
cooky451 schrieb:
Ein Draft gibt's hier:
http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1124.pdfah, supi, danke.
-
DirkB schrieb:
B.B. schrieb:
du meinst
if(*b==0) return 0;
? :p
Nein ich meine
if(*b==0) return a;
Du gibts den Zeiger zurück, nicht den Offset.
Der Leerstring ist schon am Anfang enthalten.Achsoo, es steht so im Standard
If s2 points to a string with zero length, the function returns s1.
sag das doch gleich
-
B.B. schrieb:
If s2 points to a string with zero length, the function returns s1.
sag das doch gleich
Nur für dich:
Wenn b auf einen String mit der Länge Null zeigt, gibt die Funktion a zurück.
Frei mit Babelfish
-
Sollte wohl auch einfacher gehen:
const char *my_strstr(const char *s1, const char *s2) { while (*s1) { const char *a=s1++,*b=s2; while( *a && *b && *a==*b ) ++a,++b; if( !*b ) return s1-1; } return 0; }
-
DirkB schrieb:
Wenn b auf einen String mit der Länge Null zeigt, gibt die Funktion a zurück.
Frei mit Babelfishim tschtandacht steht aber s1
okok warn scherz, ich habs jetzt gerafft auch wenns iwie unlogisch ist. :p
-
B.B. schrieb:
... auch wenns iwie unlogisch ist. :p
Im Gegenteil, es ist logisch.
-
@Wutz
Eigentlich nett, aberdu bekommst nen Zugriffsfehler wenn s2 ein Nullzeiger istund meine Version müsste eigentlich schneller sein, da du Bereiche doppelt prüfst :p
(Ok, wirklich messen kann man den Unterschied vermutlich nicht.)Edit:
Verdammt, der Standard macht mich fertig.