Problem mit strstr
- Xin
- nur zu Besuch hier
- Beiträge: 8862
- Registriert: Fr Jul 04, 2008 11:10 pm
- Wohnort: /home/xin
- Kontaktdaten:
Re: Problem mit strstr
Das wird hier recht prosaartig. "usw." und "oder so" beschreibt keinen Algorithmus.
Das kaufe ich Dir nicht ab und ein Compiler sowieso nicht.
Das kaufe ich Dir nicht ab und ein Compiler sowieso nicht.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.
Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.
Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.
Re: Problem mit strstr
Ich weiß nicht wie ich das machen soll, geschweige wie ich das programmieren soll.
Re: Problem mit strstr
Ich getrau es mich ja kaum zu Posten... aber ohne Goto schaff ichs nicht.
Wenn ich jetzt bis zum \0 bei meinem Vergleich gekommen bin, verlasse ich ja die while(needle[j+m]) Schleife und gib dann meinen Zeiger zurück. Nur ohne das goto komm ich ja nie aus der Schleife raus wenn der Vergleich nicht bis zum ende von needle gelaufen ist.
Code: Alles auswählen
char * my_strstr(char *haystack, char *needle){
int i=0, j=0, l, m;
if((int)(strlen(haystack)-strlen(needle)) >=0){ //erschöpfendes testen
again: l=0; m=0;
while(haystack[i]){
while(needle[j+m]){
if(haystack[i+l] == needle[j+m]){
l++;
m++;
}
else{
i++;
goto again;
}
}
return haystack+i;
}
}
return 0;
}
- Xin
- nur zu Besuch hier
- Beiträge: 8862
- Registriert: Fr Jul 04, 2008 11:10 pm
- Wohnort: /home/xin
- Kontaktdaten:
Re: Problem mit strstr
Du hast Goto-Verbot. Löse es anders.do6dm hat geschrieben:Ich getrau es mich ja kaum zu Posten... aber ohne Goto schaff ichs nicht.
Wofür brauchst l?
Und wofür brauchst Du m?
Was soll diese Zeile?
Code: Alles auswählen
if((int)(strlen(haystack)-strlen(needle)) >=0){ //erschöpfendes testen
Wirf den Code weg, dann lies das und dann probiere es nochmal.do6dm hat geschrieben:Wenn ich jetzt bis zum \0 bei meinem Vergleich gekommen bin, verlasse ich ja die while(needle[j+m]) Schleife und gib dann meinen Zeiger zurück. Nur ohne das goto komm ich ja nie aus der Schleife raus wenn der Vergleich nicht bis zum ende von needle gelaufen ist.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.
Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.
Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.
Re: Problem mit strstr
m und l brauch ich, weil ich i ja nicht erhöhen darf, sonst würde ich ja wenn der Vergleich nicht geklappt hätte, nicht an der nächsten Stelle von haystack weitersuchen, sondern um soviele Stellen weiter, wie ich i in meiner if Abfrage erhöht habe. m brauche ich allerdings nicht fällt mir da so auf, hier dürfte ich j erhöhen.
if((int)(strlen(haystack)-strlen(needle)) >=0){ //erschöpfendes testen
Wenn die differenz von haystack und needle was positives oder null ergibt, führt er das aus was zwischen den geschweiften Klammern steht. Das (int) ist dafür, dass er die "Zahlenwerte" von einander abzieht, und nicht zwei Funktionen voneinander subtrahieren will, was ja nicht gehen würde. (int) nennt man glaub cast.
Wenn der Ausdruck falsch ist, also was negatives rauskommt, überspringt er sofort meinen ganzen Vergleichscode und gibt den Nullzeiger zurück.
Die Seite über Schleifen lese ich gerade.
if((int)(strlen(haystack)-strlen(needle)) >=0){ //erschöpfendes testen
Wenn die differenz von haystack und needle was positives oder null ergibt, führt er das aus was zwischen den geschweiften Klammern steht. Das (int) ist dafür, dass er die "Zahlenwerte" von einander abzieht, und nicht zwei Funktionen voneinander subtrahieren will, was ja nicht gehen würde. (int) nennt man glaub cast.
Wenn der Ausdruck falsch ist, also was negatives rauskommt, überspringt er sofort meinen ganzen Vergleichscode und gibt den Nullzeiger zurück.
Die Seite über Schleifen lese ich gerade.
- Xin
- nur zu Besuch hier
- Beiträge: 8862
- Registriert: Fr Jul 04, 2008 11:10 pm
- Wohnort: /home/xin
- Kontaktdaten:
Re: Problem mit strstr
Gut, m ist überflüssig, darum geht es mir.do6dm hat geschrieben:m und l brauch ich, weil ich i ja nicht erhöhen darf, sonst würde ich ja wenn der Vergleich nicht geklappt hätte, nicht an der nächsten Stelle von haystack weitersuchen, sondern um soviele Stellen weiter, wie ich i in meiner if Abfrage erhöht habe. m brauche ich allerdings nicht fällt mir da so auf, hier dürfte ich j erhöhen.
Funktionen geben Werte zurück. Diese werden subtrahiert. strlen liefert ein size_t zurück, was in der Regel ein 'unsigned int' ist.do6dm hat geschrieben:if((int)(strlen(haystack)-strlen(needle)) >=0){ //erschöpfendes testen
Wenn die differenz von haystack und needle was positives oder null ergibt, führt er das aus was zwischen den geschweiften Klammern steht. Das (int) ist dafür, dass er die "Zahlenwerte" von einander abzieht, und nicht zwei Funktionen voneinander subtrahieren will, was ja nicht gehen würde. (int) nennt man glaub cast.
Ein Cast ist hier nicht erforderlich. Als nächstes verbiete ich Dir casts zu benutzen, außer wenn Du malloc dahinter stehen hast.
Keine Castings!
Wie wär's damit?
Code: Alles auswählen
if( strlen(haystack) >= strlen(needle) )
Gut, danach bin ich auf den Quelltext gespannt.do6dm hat geschrieben:Die Seite über Schleifen lese ich gerade.

Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.
Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.
Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.
Re: Problem mit strstr
Das ist natürlich schon übersichtlicher. Das zeug mit dem Cast hab ich aus ner alten Prüfungsaufgabe, die lautet:Xin hat geschrieben:
Wie wär's damit?Was liest sich einfacher?Code: Alles auswählen
if( strlen(haystack) >= strlen(needle) )
In dem Lösungsbeispiel für Übungsaufgabe 19 wird in my_strstr() eine goto-Anweisung
genutzt. Wozu wird sie benötigt? Kann man den Beispielcode auch ohne goto-Anweisung
ausführen? Wozu benötigen wir (int) im Testen bei
ET: while ((int)(strlen(haystack)-strlen(needle)) >= 0) {
Was ist (int) für eine Anweisung?
Allerdings hab ich nicht das Lösungsbeispiel von der oben genannten Übungsaufgabe 19 und deswegen hab ich auch den Code mit goto geschrieben, obwohl ich weiß, dass man goto nicht benutzen soll. Wie würdest du dann diese Frage beantworten?
- cloidnerux
- Moderator
- Beiträge: 3125
- Registriert: Fr Sep 26, 2008 4:37 pm
- Wohnort: Ram (Gibts wirklich)
Re: Problem mit strstr
Gotos werden dazu genutzt, um zu einer beliebigen stelle zu springen, in dem Fall kehrst du zurück zur Suche, da die Stelle an der du eine Übereinstimmung in einem Teil des Such-Stringes hattest, es eben doch nicht vollständig gepasst hatte.In dem Lösungsbeispiel für Übungsaufgabe 19 wird in my_strstr() eine goto-Anweisung
genutzt. Wozu wird sie benötigt?
Aber Gotos sollte man auf tunlichste Vermeiden, da sie nämlich den Code undurchschaubar machen, da du WILD durch den Code springst und nicht logisch, wie mit Schleifen oder Ifs.
Daher könnte es passieren, dass du mit goto an eine stelle Springst, Variablen falsch änderst, wo anders hin springst und dien Programm crasht und dann suchst du Stundenlang Fehler, weil es einfach undurchschaubar ist.
Gotos finden daher nur in einigen Treibern Anwendung, dort aber eher aus Performance und anderen Gründen, die für jeden "normalen" Programmierer nicht greifen.
Redundanz macht wiederholen unnötig.
quod erat expectandum
quod erat expectandum
- Xin
- nur zu Besuch hier
- Beiträge: 8862
- Registriert: Fr Jul 04, 2008 11:10 pm
- Wohnort: /home/xin
- Kontaktdaten:
Re: Problem mit strstr
Hmm... ungefähr so halte ich für angebracht:do6dm hat geschrieben:Das ist natürlich schon übersichtlicher. Das zeug mit dem Cast hab ich aus ner alten Prüfungsaufgabe, die lautet:
In dem Lösungsbeispiel für Übungsaufgabe 19 wird in my_strstr() eine goto-Anweisung
genutzt. Wozu wird sie benötigt? Kann man den Beispielcode auch ohne goto-Anweisung
ausführen? Wozu benötigen wir (int) im Testen bei
ET: while ((int)(strlen(haystack)-strlen(needle)) >= 0) {
Was ist (int) für eine Anweisung?
Allerdings hab ich nicht das Lösungsbeispiel von der oben genannten Übungsaufgabe 19 und deswegen hab ich auch den Code mit goto geschrieben, obwohl ich weiß, dass man goto nicht benutzen soll. Wie würdest du dann diese Frage beantworten?
"Sehr geehrter Herr/Frau <NameEinsetzen>
WAS IST DAS HIER FÜR EINE VER<F-Wort einsetzen> <S-Wort einsetzen>, DIE SIE UNS HIER BEIBRINGEN?"
Wie man sieht, bringt euch euer Lehrer bei, mit goto zu denken. Wenn Du qualitative, lesbare und wartbare Software schreiben willst, dann denkst Du ausschließlich in ganz besonderen Ausnahmebedingungen an goto, die ich meinen Schülern nur und ausschließlich nur dann nenne, wenn sie in diese Ausnahmen reinlaufen und bis dahin versuche ich die Denkweise der Schüler so zu formen, dass sie als allererstes an einen qualitativen, lesbaren und wartbaren Quellcode denken, wenn sie etwas entwickeln.
Es ist nunmal so, dass man das erste, was man sieht erstmal als Lösung für alles probiert und erst bei Problemen nach Alternativen sucht. Du hast Dein Problem mit goto gelöst und nun gelernt, dass Du so zu einer Lösung kommst. Du bekommst jetzt zufällig Gegenwind, weil hier einer Amok läuft und das komplett ablehnt. Wäre dem nicht so, würdest Du so weiter machen. Wenn das eine läuft, programmierst Du das nächste. Du hast jetzt Goto gesehen und versuchst alles mit Goto zu programmieren. So baust Du Dir eine Ansammlung von Funktionen auf, die man dann später alle in die Tonne werfen kann.
Heißt: Du musst Dir jetzt deutlich mehr Mühe geben, kein besch... Programmierer zu werden.
Das wiederum bezeichne ich als eine beschissene Ausbildung.
Du vergisst goto. Und Du vergisst Castings (außer vor malloc). Wenn Du eins von beiden brauchst, kannst Du davon ausgehen, dass der Code falsch ist. Wenn Du eins von beiden liest, geh davon aus, dass der Code scheiße ist. Es gibt (nahezu) überhaupt keinen Grund, diese Sprachfunktionalitäten zu benutzen, wenn man qualitativen, lesbaren und wartbaren Quellcode schreibt - auch bei großen und aufwendigen Projekten.
Diese seltenen Ausnahmen findet man nicht im Anfängerstadium, selbst nicht als Fortgeschrittener.
Also - wann immer Du goto oder Castings siehst, läuft was verkehrt.
Kein Goto, kein Casting, keine Ausnahme.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.
Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.
Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.
Re: Problem mit strstr
So, 3 Liter Kaffee später... Kein goto, kein Cast, nur eine Schleife und lesbar ists auch noch 

Code: Alles auswählen
char * my_strstr(char *haystack, char *needle){
int hL = strlen(haystack);
int i=0, j=0, l=0;
if( strlen(haystack) >= strlen(needle) ){
while(needle[j]){
if(haystack[i+l] == needle[j]){
l++;
j++;
continue;
}
i++;
l=0;
j=0;
if(i == hL){
return 0;
}
}
return haystack+i;
}
return 0;
}