Hallo Leute,
ich lerne gerade für eine Klausur und soll zwecks einer Übung
überprüfen, wie oft string 2 in string 1 vorkommt.
Dazu habe ich folgendes Programm geschrieben:
1
/* 8. Schreiben Sie eine Funktion, die feststellt, wie oft ein String in einem anderen enthalten
2
ist.*/
3
4
#define _CRT_SECURE_NO_WARNINGS
5
#define max 20
6
#include<stdio.h>
7
#include<stdlib.h>
8
#include<string.h>
9
10
charstr1[max]="adc adc adc";
11
charstr2[max]="adc";
12
char*c;//Vergleich zutreffend
13
intcnt,v;
14
charstrvgl(charx[],chary[]);
15
16
17
voidmain(void)
18
{
19
puts("wie oft kommt str2 in str1 vor?");
20
strvgl(str1,str2);
21
printf("str 2 ist %d mal enthalten",v);
22
23
}
24
25
26
charstrvgl(charx[],chary[])
27
{
28
for(cnt=0;c-str1<20;cnt++)
29
{
30
v=x-str1;// Position der Übereinstimmung
31
c=strstr(x,y);
32
printf("%d\n",cnt);
33
34
35
}
36
returncnt;
37
38
}
Sollte soweit auch richtig sein, bis auf die funktion "strvgl".
so wird der Vergleich zwar mehrmals ausgeführt, aber immer vom Anfang
des Strings1. Ich müsste String 1 ja um die Posiotion der gefundenen
stelle verschieben und dann erst einen erneuten vergleich durchführen,
also str1=stelle-str1.
Wie realisiere ich das in der Funktion? Gibt es einen einfacheren weg?
Ist die Schleifenbedingung der For-Schleife richtig?
MfG
Peter schrieb:> char str1[max] = "adc adc adc";
Der Test-String ist ein Spezialfall, evtl. besser so etwas nehmen:
"abcadcf adcvbnadcc dacadcfg adc adcadc adcadca aadcc"
Alexander S. schrieb:> Der Test-String ist ein Spezialfall, evtl. besser so etwas nehmen:>> "abcadcf adcvbnadcc dacadcfg adc adcadc adcadca aadcc"
Danke, wurde übernommen :)
Deine Funktion strvgl ist ziemlich sinnlos, da sie eigentlich nur mit
globalen Variablen arbeitet.
Und verzichte auf die Magic Numbers (20 in strvgl)
Der richtige Wert wäre die Stringlänge.
Aber auch den brauchst du nicht.
Werte den Rückgabewert von strstr aus. Daran kannst du erkennen, ob der
String überhaupt drin vorkommt.
Dirk B. schrieb:> Deine Funktion strvgl ist ziemlich sinnlos, da sie eigentlich nur mit> globalen Variablen arbeitet.
so lautet aber die Aufgabe, kann natürlich die globalen variablen, die
ich nur in der Funktion brauche auch noch in die Funktion verschieben.
Dirk B. schrieb:> Werte den Rückgabewert von strstr aus. Daran kannst du erkennen, ob der> String überhaupt drin vorkommt.
Das wäre ja mein v. string 2 kommt an der stelle v in string 1 vor.
Peter schrieb:> Dirk B. schrieb:>> Deine Funktion strvgl ist ziemlich sinnlos, da sie eigentlich nur mit>> globalen Variablen arbeitet.>> so lautet aber die Aufgabe, kann natürlich die globalen variablen, die> ich nur in der Funktion brauche auch noch in die Funktion verschieben.
Ach du Scheiße
Ohne Gewähr:
strstr liefert, wenn der Substring nicht gefunden wurde, eine NULL
zurück.
Wenn es ihn gibt, die Adresse vom ersten Zeichen.
Du musst also nicht von jeder Position aus suchen, sondern nur von den
gefundenen.
Du willst strstr wie ein strncmp (Standardfunktion) missbrauchen. Das
geht aber nicht.
Und wenn NULL auftaucht, kommt deine gesamte Berechnung durcheinander
Du musst auch mal mit Beispielen arbeiten, wo kein Treffer erzielt wird.
Peter schrieb:> Ich möchte doch aber wissen, wie oft es vorkommt und dies ausgeben
Die Ausgabe erfolgt in der rufenden Funktion.