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 » Mi Feb 08, 2012 11:23 am

Gut, über die Lesbarkeit sprechen wir dann, wenn wir die Frage klärt haben, ob es funktioniert.

Funktioniert es?

Was ist der Unterschied zwischen l und j?
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:18 pm

Funktionieren tut es. Wenn ich für needle z.B. a, aa, z eingebe gibt es den Nullzeiger, ebenso wenn needle länger als haystack ist.
Geb ich für needle ana ein, gibt es anane aus, geb ich ane ein, gibts ane aus.

Es gibt keinen Unterschied zwischen l und j.^^ Hier mal das ganze Programm mit ohne l. :)

Code: Alles auswählen

char * my_strstr(char *haystack, char *needle);

int main(){
    
char string[] = "Banane";
char needle[] = "ana";
char *ptr;
ptr = my_strstr(string, needle);


printf(" %s ", ptr);
    
    system("PAUSE");
    return 0;
}

char * my_strstr(char *haystack, char *needle){
     int hL = strlen(haystack);
     int i=0, j=0;
     if( strlen(haystack) >= strlen(needle) ){ 
                               while(needle[j]){
                                   if(haystack[i+j] == needle[j]){
                                              j++;
                                              continue;
                                   }  
                                              i++;                                              
                                              j=0;
                                              if(i == hL){
                                                   return 0;
                                              }
                               }  return haystack+i;                                               
    }  
    return 0;
}

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 » Mi Feb 08, 2012 2:04 pm

do6dm hat geschrieben:Funktionieren tut es. Wenn ich für needle z.B. a, aa, z eingebe gibt es den Nullzeiger, ebenso wenn needle länger als haystack ist.
Wenn Du 'a' eingibst bekommst Du den Nullzeiger?
Unerwartet, aber interessant.
do6dm hat geschrieben:Geb ich für needle ana ein, gibt es anane aus, geb ich ane ein, gibts ane aus.
Klingt gut, dann verstehe ich den Code nicht.

Bitte formatiere den Code mal halbwegs sinnvoll:
Das gilt für alle kommenden Quelltexte.

Code: Alles auswählen

char * my_strstr(char *haystack, char *needle);

int main()
{
  char string[] = "Banane";
  char needle[] = "ana";
  char *ptr;
  ptr = my_strstr(string, needle);

  printf(" %s ", ptr);
    
  system("PAUSE");
  return 0;
}

char * my_strstr(char *haystack, char *needle)
{
  int hL = strlen(haystack);
  int i=0, j=0;

  if( strlen(haystack) >= strlen(needle) )  // <- hier kannst Du hL nehmen!
  { 
    while(needle[j])
    {
      if(haystack[i+j] == needle[j])
      {
        j++;
        continue;
      }

      i++;                                              
      j=0;
      if(i == hL)
      {
        return 0;
      }
    }  

    return haystack+i;                                               
  }  
  return 0;
}
Jetzt verstehe ich den Code auch besser, da ich die Klammen jetzt richtig zuordnen kann. Ich las aus Deiner Funktion, dass i grundsätzlich erhöht wird, 'B' also nicht korrekt gefunden werden könnte.

Der Aufbau ist ... ungewöhnlich, die meisten gehen den Heuhaufen ab, ob sie die Nadel finden, Du vergleichst die Nadel solange mit dem Heuhaufen, bis die vollständige Nadel mit einem Halm übereinstimmt oder jeder Halm verglichen wurde. Das geht natürlich auch.


Interessant ist Deine Mischung aus Arrayzugriffen und Pointerarithmetik (haystack+i). Ersteres ist allgemein als besser lesbar angesehen (&haystack), Pointerarithmetik ist schneller.

Ansonsten ist Code soweit in Ordnung. Trotzdem zwei Anregungen:

Code: Alles auswählen

      i++;                                              
      j=0;
      if(i == hL)
      {
        return 0;
      }
Die Frage i == hL stellst Du immer. Falls Du 0 zurückgibst, war die Zuweisung j=0 sinnfrei. Pack sie dahinter, so dass sie nur ausgeführt wird, falls Du sie brauchst. Spart nicht viel, das ist ein prinzipieller Hinweis.

Code: Alles auswählen

    while(needle[j])
    {
      if(haystack[i+j] == needle[j])
Du greifst zweimal nach needle[j]. Du könntest den Wert auch kurz zwischenspeichern.
Und natürlich die doppelte Bestimmung von strlen( haystack ).

Wenn Du Bock hast, schreib die Routine neu ohne Indizes, nur mit Pointerarithmetik. Also kein i, kein j, nur Pointer. Das ist dann eigentlich schon die Königsdisziplin.
Fang mit i an. Statt i um eins zu erhöhen, addiere haystack um 1. Haystack ist nur ein Zeiger, der in diese Funktion kopiert wurde. Addierst Du ihn um 1, zeigt er auf das nächste Char.

Die Funktion würde ich Dir so - wenn sie sauber formatiert ist - mit den Hinweisen abnehmen. Das ist als Übung in Ordnung - solange Du bei 'a' keinen Nullzeiger bekommst...
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 2:32 pm

Sorry, da hab ich mich vertan. Bei a bekomm ich natürlich anane als Ausgabe.
Wie immer, vielen Dank für deine Hilfe!
Neu schreiben kann ich jetzt aus Zeitgründen grad nicht. Hab morgen schon die Klausur.

Mal ne allgemeine Frage, was ist ein postfix und ein präfix argument, bzw. der Unterschied?

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 » Mi Feb 08, 2012 3:08 pm

do6dm hat geschrieben:Sorry, da hab ich mich vertan. Bei a bekomm ich natürlich anane als Ausgabe.
Wie immer, vielen Dank für deine Hilfe!
Neu schreiben kann ich jetzt aus Zeitgründen grad nicht. Hab morgen schon die Klausur.

Mal ne allgemeine Frage, was ist ein postfix und ein präfix argument, bzw. der Unterschied?
Das verwendet man üblicherweise bei unären Operatoren (Operatoren, die nur ein Argument haben)

Prä ist "Vor", Post ist "Nach". Ein Präfix-Operator ist zum Beispiel "-" für den Vorzeichenwechsel des nachfolgenden: -9.
C kennt vorrangig Prefix-Operatoren: &var, *var, !var.

Postfix ist hinter den Operanden. Beispiel in C weiß ich gerade mal nicht... müsste es auch nicht geben außer

++ und --, welche es in beiden Varianten gibt:
i++ oder ++i.

Der Unterschied ist die Rückgabe:
Wenn i = 1 ist, dann rechnet ++i zuerst und gibt dann das Ergebnis 2 zurück.
Wenn i = 1 ist, dann speichert i++ erst den Wert von i und erhöht i danach. Das gespeicherte Ergebnis 1 wird zurückgegeben.

i++ kann entsprechend aufwendiger sein als ++i. In C sind beide gleich schnell, in C++ kann es einen Unterschied machen.
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.

Antworten