Wörter auslesen



  • wenn b leer ist und a nicht, dann gebe ich a zurück? 😕



  • char *my_strstr(const char *s1, const char *s2)
    {
      const char *t = s2, *p = 0;
      if (!*s2)
        return (char*)s1;
      while (*s1)
      {
        if (*s1 == *t)
        {
          if (!p)
            p = s1;
          if (!*(++t))
            return (char*)p;
        }
        else
        {
          t = s2;
          p = 0;
        }
        ++s1;
      }
      return 0;
    }
    

    😃

    B.B. schrieb:

    soso, dem standard nach ist es falsch, nagut, wo kann man den runterladen?

    Gar nicht. Ein Draft gibt's hier:
    http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1124.pdf



  • cooky451 schrieb:

    Ein Draft gibt's hier:
    http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1124.pdf

    ah, supi, danke.

    🙂



  • DirkB schrieb:

    B.B. schrieb:

    du meinst

    if(*b==0) return 0;
    

    ? :p

    Nein ich meine

    if(*b==0) return a;
    

    Du gibts den Zeiger zurück, nicht den Offset.
    Der Leerstring ist schon am Anfang enthalten.

    Achsoo, es steht so im Standard

    If s2 points to a string with zero length, the function returns s1.

    sag das doch gleich 😃

    🙂



  • B.B. schrieb:

    If s2 points to a string with zero length, the function returns s1.

    sag das doch gleich 😃

    🙂

    Nur für dich:

    Wenn b auf einen String mit der Länge Null zeigt, gibt die Funktion a zurück.
    Frei mit Babelfish 😃



  • Sollte wohl auch einfacher gehen:

    const char *my_strstr(const char *s1, const char *s2)
    {
      while (*s1)
      {
        const char *a=s1++,*b=s2;
        while( *a && *b && *a==*b ) ++a,++b;
        if( !*b ) return s1-1;
      }
      return 0;
    }
    


  • DirkB schrieb:

    Wenn b auf einen String mit der Länge Null zeigt, gibt die Funktion a zurück.
    Frei mit Babelfish 😃

    im tschtandacht steht aber s1 😃

    okok warn scherz, ich habs jetzt gerafft auch wenns iwie unlogisch ist. :p



  • B.B. schrieb:

    ... auch wenns iwie unlogisch ist. :p

    Im Gegenteil, es ist logisch.



  • @Wutz
    Eigentlich nett, aber du bekommst nen Zugriffsfehler wenn s2 ein Nullzeiger ist und meine Version müsste eigentlich schneller sein, da du Bereiche doppelt prüfst :p
    (Ok, wirklich messen kann man den Unterschied vermutlich nicht.)

    Edit:
    Verdammt, der Standard macht mich fertig.



  • Wutz schrieb:

    Sollte wohl auch einfacher gehen:

    const char *my_strstr(const char *s1, const char *s2)
    {
      while (*s1)
      {
        const char *a=s1++,*b=s2;
        while( *a && *b && *a==*b ) ++a,++b;
        if( !*b ) return s1-1;
      }
      return 0;
    }
    

    was daran einfacher ist kann ich nicht erkennen. du packst quasi meine erste if-abfrage in deine while-schleife rein.
    nagut, eine if-abfrage hast du dann immerhin insgesamt weniger drin :D.
    aber deutlich kürzer ist deine version jedenfalls und den trick *a=s1++ find ich auch gut, hut ab 👍, hätte von mir sein können. 😉 :p



  • cooky451 schrieb:

    ... aber du bekommst nen Zugriffsfehler wenn s2 ein Nullzeiger ist ...

    Na und!
    Das passiert bei den Standardfunktionen auch.
    Du als Programmierer hast dafür zu sorgen, dass die Funktion keinen NULL-Zeiger bekommt.



  • DirkB schrieb:

    Das passiert bei den Standardfunktionen auch.

    Argh da habe ich etwas verwechselt, werde mich alsbald beschämt in meine Höhle verkriechen 😞



  • Die meisten Standardfunktionen beachten den NULL-Zeiger nicht.
    strlen() versucht auch immer brav die Länge der Zeichenkette zu ermitteln, auf die der übergebene Zeiger zeigt.
    Wenn der auf NULL zeigt und das Programm hat keine Zugriffsrechte auf die Adresse NULL, so ist das strlen() egal. Dann hat der Programmierer einen Fehler gemacht, nicht strlen() .


Anmelden zum Antworten