Problem mit strstr

Schnelle objektorientierte, kompilierende Programmiersprache.
Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Problem mit strstr

Beitrag von Xin » Di Feb 07, 2012 5:40 pm

Das wird hier recht prosaartig. "usw." und "oder so" beschreibt keinen Algorithmus.

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.

do6dm
Beiträge: 26
Registriert: Fr Jan 27, 2012 9:09 am

Re: Problem mit strstr

Beitrag von do6dm » Di Feb 07, 2012 6:28 pm

Ich weiß nicht wie ich das machen soll, geschweige wie ich das programmieren soll.

do6dm
Beiträge: 26
Registriert: Fr Jan 27, 2012 9:09 am

Re: Problem mit strstr

Beitrag von do6dm » Di Feb 07, 2012 6:50 pm

Ich getrau es mich ja kaum zu Posten... aber ohne Goto schaff ichs nicht.

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;
}
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.

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Problem mit strstr

Beitrag von Xin » Di Feb 07, 2012 7:22 pm

do6dm hat geschrieben:Ich getrau es mich ja kaum zu Posten... aber ohne Goto schaff ichs nicht.
Du hast Goto-Verbot. Löse es anders.

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
Genau erklären!
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.
Wirf den Code weg, dann lies das und dann probiere es nochmal.
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.

do6dm
Beiträge: 26
Registriert: Fr Jan 27, 2012 9:09 am

Re: Problem mit strstr

Beitrag von do6dm » Di Feb 07, 2012 7:56 pm

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.

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Problem mit strstr

Beitrag von Xin » Di Feb 07, 2012 9:41 pm

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.
Gut, m ist überflüssig, darum geht es mir.
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.
Funktionen geben Werte zurück. Diese werden subtrahiert. strlen liefert ein size_t zurück, was in der Regel ein 'unsigned int' ist.

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) )
Was liest sich einfacher?
do6dm hat geschrieben:Die Seite über Schleifen lese ich gerade.
Gut, danach bin ich auf den Quelltext gespannt. :-)
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.

do6dm
Beiträge: 26
Registriert: Fr Jan 27, 2012 9:09 am

Re: Problem mit strstr

Beitrag von do6dm » Di Feb 07, 2012 10:36 pm

Xin hat geschrieben:
Wie wär's damit?

Code: Alles auswählen

if( strlen(haystack) >= strlen(needle) )
Was liest sich einfacher?
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?

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3125
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Problem mit strstr

Beitrag von cloidnerux » Di Feb 07, 2012 11:05 pm

In dem Lösungsbeispiel für Übungsaufgabe 19 wird in my_strstr() eine goto-Anweisung
genutzt. Wozu wird sie benötigt?
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.
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

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Problem mit strstr

Beitrag von Xin » Di Feb 07, 2012 11:08 pm

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?
Hmm... ungefähr so halte ich für angebracht:

"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.

do6dm
Beiträge: 26
Registriert: Fr Jan 27, 2012 9:09 am

Re: Problem mit strstr

Beitrag von do6dm » Mi Feb 08, 2012 1:16 am

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;
}

Antworten