Problem bei Strings
-
Guten Abend,
ich habe folgendes Problem:
ich möchte meiner Main Methode eine Zeichenkette übergeben
z.b ==> "das hier ist bla bla eine Zeichenkette bla bla"
ausserdem übergebe ich eine zweite Zeichenkette oder Buchstaben
z.b ==> "bla"jetzt suche ich nach einem Algorithmus der die Zeichenkette sucht und angibt wie oft dieser vorkommt in diesem Beispiel währen es bei "bla" ja 4 mal !!
Ganz wichtig ist noch das ich nur mit Pointer arbeiten darf. die Funktion heisst findstring und sieht bis jetzt so aus
#include <string.h>
int findstring(char ** c1, char * c2){ // muss so bleiben
int zaehler=0;for(int i =0; i<strlen(c1[0]);i++){
printf("%s\n",c1[0]+i);
if(strstr(c1[0]+i,c2))
{ zaehler++;printf("GEFUNDEN =====> %s \n",c1[0]+i);
}}
c1[0]++; c2++;return zaehler;
}
ich komme einfach nicht weiter da er in diesem fall ja so lange von links nach rechts geht und den zaehler immer hochzählt dadurch bekomme ich eine zu hohe zahl.
Hier nochmal die Beschreibung der Aufgabe von Doktor :
Die Funktion findstring() soll folgende Funktionalität besitzen:
+ Funktionsparameter: die Adresse eines Zeigers, der auf den Anfang der
Zeichenkette / des Speichers zeigt, sowie die Adresse der zu suchenden
Teilzeichenkette
Prototyp: int findstring(char **, char
+ Rückgabewerte: über den ersten Übergabeparameter wird die vorletzte
gefundene Adresse der Teilzeichenkette zurück gegeben (NULL, wenn keine
vorletzte Adresse vorhanden); der Rückgabewert der Funktion (return) soll die
Anzahl der gefundenen Teilzeichenketten erhalten
+ Eine Teilzeichenkette kann mit der C-Funktion strstr() gesucht werden
+ Weitere Funktionalität soll die Funktion nicht besitzendanke im Vorraus
-
Ungetestet, da im Kopf programmiert:
vorletzter_fund = NULL letzter_fund = NULL anzahl_funde = 0 suchposition = anfang der zu durchsuchenden Kette solange(suchposition = strstr(suchposition, zu suchende zeichenkette) nicht NULL ist) { vorletzter_fund = letzter_fund letzter_fund = suchposition erhöhe anzahl_funde um 1 erhöhe suchposition um X } Setze c1 auf vorletzter_fund Gebe anzahl_funde zurück
Dabei gilt noch zu klären, was X ist. Es gibt zwei sinnvolle Werte, aber aus der Aufgabenstellung ergibt sich nicht, welcher gesucht ist. Die beiden sinnvollen Werte sind 1 oder die Länge des zu suchenden Strings. Der Unterschied liegt bei Szenarien wie dem folgenden:
Zu durchsuchende Zeichenkette: "blablabla"
Zu suchende Zeichenkette: "blabla"
Ist die gesuchte Antwort nun 1 oder 2? Ist die Antwort 1 gesucht, dann muss X gleich der Länge von "blabla" sein. Ist die Antwort 2 gesucht, dann muss X gleich 1 sein.
-
#include <string.h>
int findstring(char ** c1, char * c2){
int claenge= strlen(c2);char *vorletzter_fund=NULL;
char *letzter_fund=NULL;
int anzahl_funde=0;
char *suchposition=c1[0];do{
vorletzter_fund=letzter_fund;
letzter_fund=c1[0];
suchposition + claenge;
anzahl_funde++;
}while(suchposition == strstr(c1[0],c2)!=NULL);
c1[0]=vorletzter_fund;
printf("%s", vorletzter_fund);
printf("%s", letzter_fund);
return anzahl_funde;}
-
Informatiker im All schrieb:
...
Das wird nicht funktionieren. Beweis: Lass es laufen.
-
Es funktioniert aber nicht so wie es soll
hier unten tut er jetzt was nur er zählt wieder zu viel sprich er betrachtet immer die ganze Zeichenkette und bekommt dadurch immer wieder eine falsche Anzahl des Vorkommens
er soll ==>> durchsuchende "blablabla" gesuchte "blabla" == 2 ergeben
Siehst du den Fehler ?
danke für die Hilfe
#include <string.h>
int findstring(char ** c1, char * c2){
int claenge= strlen(c2);char *vorletzter_fund=NULL;
char *letzter_fund=NULL;
int anzahl_funde=0;
char *suchposition=c1[0];
int i =0;
while((suchposition = strstr(c1[0]+i,c2))!=NULL){
vorletzter_fund=letzter_fund;
letzter_fund=c1[0];
suchposition ++;
anzahl_funde++;
i++;
}c1[0]=vorletzter_fund;
printf("%p\n", vorletzter_fund);
printf("%p\n", letzter_fund);
return anzahl_funde;}
-
Informatiker im All schrieb:
Siehst du den Fehler ?
Ja, natürlich. Aber da ich schon eine Lösung gepostet habe, die ziemlich sicher funktionieren wird, sehe ich nicht den Mehrwert, deinen Vorschlag noch weiter zu korrigieren. Das Ergebnis wäre am Ende dann ja doch etwas, was meinem Vorschlag entspricht. Zumal es sehr mühsam wäre, die Fehlerzeilen zu benennen, da du deinen Code nicht formatierst. Fang doch direkt mit meinem Vorschlag an!
-
SeppJ schrieb:
Informatiker im All schrieb:
Siehst du den Fehler ?
Ja, natürlich. Aber da ich schon eine Lösung gepostet habe, die ziemlich sicher funktionieren wird, sehe ich nicht den Mehrwert, deinen Vorschlag noch weiter zu korrigieren. Das Ergebnis wäre am Ende dann ja doch etwas, was meinem Vorschlag entspricht. Zumal es sehr mühsam wäre, die Fehlerzeilen zu benennen, da du deinen Code nicht formatierst. Fang doch direkt mit meinem Vorschlag an!
Ich danke die es hat geklappt !!
#include <string.h>
int findstring(char ** c1, char * c2){char *vorletzter_fund = NULL;
char *letzter_fund = NULL;
int anzahl_funde = 0;
char *suchposition = c1[0];
while((suchposition = strstr(suchposition , c2)) != NULL){
printf("%s\n", suchposition);vorletzter_fund=letzter_fund;
letzter_fund=suchposition;
suchposition ++;
anzahl_funde++;
}
c1=vorletzter_fund;
printf("%p\n %p\n",letzter_fund, vorletzter_fund);
return anzahl_funde;
}
-
Du hast die Rückgabe über c1 nicht korrekt durchgeführt. Das habe ich im Pseudocode nicht technisch detailliert vorgemacht, aber bei der tatsächlichen Lösung muss man es natürlich richtig machen.
-
SeppJ schrieb:
Du hast die Rückgabe über c1 nicht korrekt durchgeführt. Das habe ich im Pseudocode nicht technisch detailliert vorgemacht, aber bei der tatsächlichen Lösung muss man es natürlich richtig machen.
da weiss ich leider nicht wie du das meinst bzw. der Prof. Denn ich habe ja bereits einen Rückgabewert der ja die Anzahl der Funde ist.
wie wäre es denn korrekt? kann man zwei Rückgabewerte ausgeben?
-
Du selber schrieb:
+ Rückgabewerte: über den ersten Übergabeparameter wird die vorletzte
gefundene Adresse der Teilzeichenkette zurück gegeben (NULL, wenn keine
vorletzte Adresse vorhanden); der Rückgabewert der Funktion (return) soll die
Anzahl der gefundenen Teilzeichenketten erhaltenHervorhebung durch mich. Es kam garantiert im Kurs dran, wie man über einen Zeigerparameter einen Wert nach draußen bekommt, sonst wäre es nicht Teil der Aufgabe. Hast du dich denn nicht über die Vorgabe gewundert, dass c1 ein
char**
anstatt eineschar*
sein soll?Tipp: Wahrscheinlich wurde behandelt, wie man mittels eines Zeigers einen nicht-Zeiger zurück geben kann. Natürlich gilt das auch eine Stufe weiter, d.h. mittels eines Zeigers auf einen Zeiger, kann man einen Zeiger zurück geben.