C: Mehreres Vorkommen eines String in einem anderen

D

drummer

Mitglied
Thread Starter
Dabei seit
18.10.2003
Beiträge
52
Reaktionspunkte
1
Hallo,

Ich soll ein C-Programm erstellen, welches ausgibt, wie oft ein String (string2) in einem anderen (string1) enthalten ist.

Mit strstr kann ich Strings vergleichen. Doch diese Funktion bricht ab, wenn sie string2 in string1 findet. Ich möchte aber den gesamten string1 nach string2 durchsuchen.

Hat da jemand eine Idee?
 
ist doch eine einfache schleife...
string länge holen und dann prüfen...
 
Hi,

Mach eine Schleife um strstr, die abbricht, wenn nichts mehr gefunden wird.
Erster Startpunkt ist natürlich Index 0. Die nächste Startpunkte ist jeweils der Index_zuvorgefunden + 1;
 
Hi Wast,

ich habe jetzt folgendes Programm geschrieben:

/* Mit strstr suchen. */

#include <stdio.h>
#include <string.h>

#define MAX 100

int main()
{
char *p, *loc, Stelle, puffer1[MAX], puffer2[MAX];
int anzahl = 0;

/* Strings eingeben. */

printf("Geben Sie den String ein, der durchsucht werden soll: ");
gets(puffer1);
printf("Geben Sie den zu suchenden String ein: ");
gets(puffer2);

p = puffer1;
Stelle = 0;

/* Suche durchfuehren. */

while( ( loc = strstr(p, puffer2)) != NULL)
{
Stelle = loc - puffer1;
p = p + Stelle;
anzahl++;
}

printf( "\"%s\" ist in \"%s\" %d mal enthalten", puffer2, puffer1, anzahl-1);

return 0;
}

Gebe ich z.B. einen String "Hallo, Hallo, hallo, Hallo" ein und suche nach "hallo" kommt hallo 1 mal vor, was ja auch stimmt. Wenn ich aber nach "Hallo" suche, hängt sich das Programm auf. Warum?
 
da mutiert wohl deine schleife zur endlosschleife...
warum gehst du nicht stupide die stringlänge durch?
sieht sehr komisch aus was du da machst...
 
Hi, ich hab jetzt die Schleife umgestellt. Aber es kommt immernoch der gleiche Fehler.

/* Mit strstr suchen. */

#include <stdio.h>
#include <string.h>

#define MAX 100

int main()
{
char *loc, Stelle, puffer1[MAX], puffer2[MAX];
int anzahl = 0;

/* Strings eingeben. */

printf("Geben Sie den String ein, der durchsucht werden soll: ");
gets(puffer1);
printf("Geben Sie den zu suchenden String ein: ");
gets(puffer2);

Stelle = 0;

/* Suche durchfuehren. */

while( ( loc = strstr(puffer1[Stelle], puffer2)) != NULL)
{
Stelle = Stelle + loc - puffer1;
anzahl++;
}

printf( "\"%s\" ist in \"%s\" %d mal enthalten", puffer2, puffer1, anzahl-1);

return 0;
}
 
Hi,

mein Ansatz wäre folgender:
/* Mit strstr suchen. */

#include <stdio.h>
#include <string.h>

#define MAX 100

int main()
{
char *loc, Stelle, puffer1[MAX], puffer2[MAX];
int anzahl = 0;

/* Strings eingeben. */

printf("Geben Sie den String ein, der durchsucht werden soll: ");
gets(puffer1);
printf("Geben Sie den zu suchenden String ein: ");
gets(puffer2);

for (Stelle = 0; Stelle < strlen(puffer1); Stelle++)
if (!strcmp(puffer2, (puffer1+Stelle)))
anzahl++;

printf( "\"%s\" ist in \"%s\" %d mal enthalten", puffer2, puffer1, anzahl-1);

return 0;
}

(ungetestet, nicht hauen wenn's nicht tut)

cu
 
Hi, ich hab jetzt die Schleife umgestellt. Aber es kommt immernoch der gleiche Fehler.

while( ( loc = strstr(puffer1[Stelle], puffer2)) != NULL)
{
Stelle = Stelle + loc - puffer1;
anzahl++;
}

dein problem ist nach wie vor die abbruch bedingung deiner schleife...
die sollte abgebrochen werden, wenn du am ende des strings bist...
s.a. z.b. die gepostete for schleife
 
sagt mal was ich nicht verstehe:

Programmieren lernt man ( eben um solche Fehler zu finden) am besten in einer Gruppe. Lernt Ihr alle allein und ladet Euere Hausaufgaben im web ab!?
 
Hi,

abgesehen, dass du noch an deinem Stiel arbeiten musst, ...

Schau dir nochmal meinen ersten Post an!Da steht +1 ;)
Dann sollte es funktionieren.
--> Dein erster Post mit der schleife sollte auch bei "hallo" in einer endlosschleife hängen bleiben.
 
  • Gefällt mir
Reaktionen: drummer
Hmm,

wie rede ich mich jetzt da wieder raus? :rolleyes:
Für die Interpretation bin ich aber nicht verantwortlich, ... ;)
 
stil ohne e ;)
 
jaja,

was so ein kleiner Buchstabe an der Bedeutung einen ganzen Satzes ändern kann, ...
 
Hi,

abgesehen, dass du noch an deinem Stiel arbeiten musst, ...

Schau dir nochmal meinen ersten Post an!Da steht +1 ;)
Dann sollte es funktionieren.
--> Dein erster Post mit der schleife sollte auch bei "hallo" in einer endlosschleife hängen bleiben.

while( ( loc = strstr(p, puffer2)) != NULL)
{
Stelle = loc - puffer1;
p += ++Stelle;
anzahl++;
}

so klappts! danke
 
Sagt mal, was passiert eigentlich wenn gets mehr als 100 Zeichen (definiert in MAX) erhält?

Bricht es ab? Ich glaube nämlich nicht. Das 201te bis 205te Zeichen werden mal eben "anzahl" mit einem frei wählbaren Wert überschrieben. Oder sehe ich das falsch?
Kommt natürlich auch auf den Prozessor an für den Kompiliert wird. Wenn es ein 64Bit ist, dann das 201te bis 209te.

@ drummer
Bevor du mit puffer1 und puffer2 arbeitest, muss du auf jeden Fall deren Länge überprüfen, ob die nicht MAX überschreiten. Ansonsten öffnest du Hackern Tür und Tor.


Gruß Fabian
 
Ich hab mal zwei Tage einen Fehler in einem C-Programm in einer der wichtigsten Anwendungen einer großen Versicherung gesucht: In der Test-Umgebung lief alles problemlos, in Produktion gab's permanent crashes.
Ursache: In dem Programm wurde unter bestimmten Umständen immer wieder über das Ende eines Array hinaus geschrieben. In der Test-Umgebung hatte das keine merklichen Auswirkungen, da dahinter Variablen positioniert waren, deren Inhalte zum Zeitpunkt des Überschreibens nicht mehr benutzt wurden.
Für die Produktions-Umgebung wurden (wie in dem Unternehmen generell üblich) andere Compiler-Flags gesetzt, wodurch sich der Compiler die Freiheit nahm, das Mapping einiger Variablen im Speicher zu ändern: Hier kamen hinter dem Array vitale Information für die weitere Steuerung des Programmablaufs . . .

AFAIK ist in C nicht festgelegt, dass die Variablen zur Laufzeit in der Reihenfolge im Speicher positioniert werden müssen, in der sie im Source-Code definiert sind (womit der Compiler korrekt agiert hat).
Nichtmal darauf kann man sich bei der Fehlersuche verlassen!


?=?
 
AFAIK ist in C nicht festgelegt, dass die Variablen zur Laufzeit in der Reihenfolge im Speicher positioniert werden müssen, in der sie im Source-Code definiert sind (womit der Compiler korrekt agiert hat).
Nichtmal darauf kann man sich bei der Fehlersuche verlassen!


?=?

Ahh, O.K. Wusste ich nicht. Aber wie du schon sagtest, kommt es ja auch immer auf den Compiler an.

Nichts desto trotz sollte man in C den Rangecheck nie vergessen, um Stack Overflows zu verhindern.


Gruß Fabian
 
Zurück
Oben Unten