Brauche Hilfe bei einer Funktion mit Strings
-
Wenn du das in cpp Tags setzt (wie es auch ind em rotenbraunen Kasten auf der Unterforenhauptseite steht), kann man das besser lesen.
char* suchenUndMarkieren(char text[],char quelle[],char ergebnis[]) { char* ptr; int postext,lenptr,lentext,i; lentext=strlen(text); ptr=strstr(text,quelle); lenptr=strlen(ptr); strncpy(ergebnis,text,lenptr-1); strcat(ergebnis,"==>"); postext=lenptr-1; while(ptr!=0) { ptr=strstr(text,quelle); for(i=postext;i<lenptr;i++) { strcat(ergebnis,text[i]); } strcat(ergebnis,"==>"); postext=i; } for(i=postext;i<lentext;i++) { strcat(ergebnis,text[i]); } return ergebnis; }
Wenn du jetzt nochmal eine konkrete Frage stellts, wo es hakt und was nicht klappt, können wir auch gezielt weiterhelfen.
Auf den ersten Blick:
In Zeile 18 suchst du immer wieder vom Anfang von text, du findest demnach auch immer wieder die selbe Stelle.In Zeile 28 rufst du strcat falsch auf. (Da denkst du auch falsch, entweder die Schleife oder strcat)
In Zeil 16 solltest du auf NULL testen ( nicht auf 0).
-
Auf den zweiten Blick
Dein Zeilen 8 - 11 kopieren dir auch nicht den ersten Teilptr=strstr(text,quelle); // Was ist wenn ptr == NULL ist? lenptr=strlen(ptr); // Was willst du damit berechnen strncpy(ergebnis,text,lenptr-1); // wenn die Länge von text > lenptr-1 ist, wird keine '\0' angehängt strcat(ergebnis,"==>"); // die ist für strcat aber wichtig
Die Anzahl Zeichen von zwischen text-Anfang und ptr gibt es mit
lenptr=ptr-text;
-
Mein Gedanke war mit strstr den quellstring zu finden alles was vor dem quellstring steht nach ergebnis zu kopieren, dann einen pfeil an ergebnis anhängen.
Danahc quelle anhängen und iweder weitersuchen nach dem nächsten quellstring.
nur das funktioniert nicht weil in ptr der ganze textstring steht und nicht nur der teil bis zum ersten gefunden quellstring.
des wegen zeile 28 is falsch ich weiß, ich wollte probieren ob man mit strcat auch einzelne zeichen anhängen can deshaöb text[i].
Deshalb würd ich mich über einen neuen Lösungsvorschlag freuen, weil meiner anscheinend für die tonne is.
-
Temeraire schrieb:
Deshalb würd ich mich über einen neuen Lösungsvorschlag freuen, weil meiner anscheinend für die tonne is.
Du hast doch schon selber erkannt, was noch fehlt, ansonsten ist die Idee doch in Ordnung. Jetzt musst du dir nur mal Gedanken machen, wie das wohl gehen könnte, dass man nicht immer am Anfang des Textrs mit der Suche anfängt.
-
so mein freund und ich haben jz ne lösung gefunden, die is aber net sehr schön wir haben eine gezielte endlosschleife bauen müssen damit es funktioniert.
hat vielleicht noch jemand verbesserungsvorschläge??char* suchenUndMarkieren(char text[],char quelle[],char ergebnis[]) { int diff,teillaenge,laenge=strlen(text); char* ptr; char* ptra; char* pfeil=("==>"); printf("Text: %s\n",text); printf("Quelle: %s\n",quelle); ptr=strstr(text,quelle); teillaenge=strlen(ptr); diff=laenge-teillaenge; strncpy(ergebnis,text,diff); if(diff>0) strcat(ergebnis,pfeil); else strcpy(ergebnis,pfeil); while(1==1) { ptra=ptr; ptr=strstr(ptra+1,quelle); if(ptr==NULL) { strcat(ergebnis,ptra); break; } laenge=teillaenge; teillaenge=strlen(ptr); diff=laenge-teillaenge; strncat(ergebnis,ptra,diff); strcat(ergebnis,pfeil); } return ergebnis; }
-
Auf strncpy möglichst verzichten, definierten ergebnis-String durch Endekennung setzen, damit anschließend ausschließlich mit strcat gearbeitet werden kann.
Auch muss natürlich der aufrufende Kontext einen "ausreichend" großen Speicherbereich für ergebnis bereitstellen, sonst schreibst du mit deiner Funktion u.U. in undefinerte Speicherbereiche.char* suchenUndMarkieren(const char *text,const char *quelle,char *ergebnis) { printf("Text: %s\n",text); printf("Quelle: %s\n",quelle); ergebnis[0]='\0'; while( (text=strstr(text,quelle))!=NULL ) { strcat(ergebnis,"==>"); strcat(ergebnis,quelle); text+=strlen(quelle); } return ergebnis; }
-
Die Lösung hätte so ausschauen sollen " Ein ==>Pferd, ein ==>Pferd, ein Koenigreich fuer ein ==>Pferd".
Habe inzwischen jetzt eine funktionierende lösung gefunden.char* suchenUndMarkieren(char text[],char quelle[],char ergebnis[]) { int diff,teillaenge,laenge=strlen(text); char* ptr; char* ptra; char* pfeil=("==>"); printf("Text: %s\n",text); printf("Quelle: %s\n",quelle); ptr=strstr(text,quelle); teillaenge=strlen(ptr); diff=laenge-teillaenge; strncpy(ergebnis,text,diff); if(diff>0) strcat(ergebnis,pfeil); else strcpy(ergebnis,pfeil); ptra=ptr; ptr=strstr(ptra+1,quelle); while(ptr!=NULL) { laenge=teillaenge; teillaenge=strlen(ptr); diff=laenge-teillaenge; strncat(ergebnis,ptra,diff); strcat(ergebnis,pfeil); ptra=ptr; ptr=strstr(ptra+1,quelle); } strcat(ergebnis,ptra); return ergebnis; }
-
Erst explizit Verbesserungsvorschläge einfordern, und sie dann nicht beachten (z.B. strncpy), ziemlich renitent das Ganze, meinst du nicht auch?
char* suchenUndMarkieren(const char *text,const char *quelle,char *ergebnis) { char *p; printf("Text: %s\n",text); printf("Quelle: %s\n",quelle); ergebnis[0]='\0'; while( p=strstr(text,quelle) ) { strncat(ergebnis,text,p-text); strcat(ergebnis,"==>"); strcat(ergebnis,quelle); text=p+strlen(quelle); } return strcat(ergebnis,text); }
-
Versuche den Code von Wutz zu verstehen.
Wenn du dabei Probleme hast, melde dich.Das ist normales C ohne irgendwelche Tricks.
-
allein das mit const char haben wir nie gelernt also wie soll ich des verstehen?
-
Temeraire schrieb:
allein das mit const char haben wir nie gelernt also wie soll ich des verstehen?
Im Buch nachlesen, das du hast (und wenn es aus der Bibliothek ist).
Es besagt, das die Variable nicht verändert wird (in diesem Fall der Inhalt von text und quelle).
ES funktioniert auch, wenn du const weglässt.